2017-07-16 16 views
1

私は、隣接リストを使ってPython 3.xで(有向グラフ)の簡単な実装を書いています。私の問題は、私はセットの辞書を使用していますので、両方がKeyErrorの発生場所を特定するにはどうすればよいですか?

にKeyError例外を上げることができるということです

class Graph(object): 

    def __init__(self): 
     self.vertices = {} 

    def add_vertex(self, x): 
     """ Adds x to the graph, if it doesn't exist """ 
     if x not in self.vertices: 
      self.vertices[x] = set() 
     else: 
      print("Error: vertex {} already in graph!".format(x))     

    def add_edge(self, x, y): 
     """ Adds the edge from x to y, if it doesn't exist """ 
     try: 
      if y not in self.vertices[x]: 
       self.vertices[x].add(y) 
      else: 
       print("Error: edge already exists!") 
     except KeyError: 
      print("Error: vertex {} not found!".format(x)) 

    def remove_edge(self, x, y): 
     """ Removes the edge from x to y, if it exists """ 

     try: 
      self.vertices[x].remove(y) 
     except KeyError: 
      # QUESTION: which part of the try block caused the KeyError? 
      print("Error: vertex not found!") 

:グラフのエッジを削除するには、私はこのようになります機能で探しています

self.vertices[x].remove(y) 

Iがこれら2つの頂点(x又はy)のいずれかが存在しないことを示すエラーメッセージを印刷したい場合は、エラーが発生した行の一部を決定する方法はありますか?または、もう一度チェックして、エラーメッセージを(繰り返し)チェックの元に戻す必要がありますか?

(注:私はいくつかの論理エラーが上記のコードでそこにいることを認識 - 例えば、add_edgeは、xとyをチェックする必要が両方存在する)

+1

スプリットにそれを試してみ応じ知りたい場合は: 'temp = self.vertices [x]'と 'temp.remove(y)'をそれぞれ別の 'try'ブロックに入れます。 – jasonharper

+0

@jasonharper:答えを自由にしてください。他の誰も短い/読みやすいものが出てこない場合は、私はそれを受け入れます。 – tonysdg

+1

エラーメッセージを印刷するためにグラフクラスが責任を負うのはなぜですか?既存のエッジを再追加したり、存在しないものを削除したりするとエラーが発生した場合は、グラフが例外を介して通信する必要があるようです。 – user2357112

答えて

1

だから、最初だけという名前のノードが存在提示するかどうかを確認してくださいXグラフで、それが存在だ場合、その後のx yに

def remove_edge(self, x, y): 
    """ Removes the edge from x to y, if it exists """  
    if x in self.vertices: 
     if y in self.vertices[x]: 
      self.vertices[x].remove(y) 
     else: 
      print("There is no edge from x to y") 
    else: 
     print("There is no node x present in the graph") 

から任意のエッジが存在するかどうかをチェックし、あなたが実際には2つの文にキャッチ

def remove_edge(self, x, y): 
    """ Removes the edge from x to y, if it exists """ 

    try: 
     self.vertices[x] 
    except KeyError: 
     print("Error: vertex x not found!") 

    try: 
     self.vertices[x].remove(y) 
    except KeyError: 
     print("Error: vertex y not found!") 
関連する問題