2017-01-25 6 views
-1

私は、元のバージョンのnetworkxからDFSのカスタマイズ版を作ろうとしています。 networkx DFS私の実装ではジェネレータPythonからのリストを返す

が、私は「もし」のラベルのリストに含まれている子を追加し、すべての後にリストを返すようにしたいが、私がすることはできません:あなたはnetworkxここからDFSの元のバージョンに関係することができますそれ

def extract_expression(label): 
    m = re.search('if(.+?)goto', label) 
    if m: 
     return m.group(1) 
    return None 

def dfs_edges(G, source=None): 
    path = list() 
    if source is None: 
     nodes = G 
    else: 
     nodes = [source] 
    visited=set() 
    for start in nodes: 
     if start in visited: 
      continue 
     visited.add(start) 
     stack = [(start,iter(G[start]))] 
     while stack: 
      parent,children = stack[-1] 
      try: 
       child = next(children) 
       label = G.node[child]['label'] 
       if "if" in label: 
        print child 
        # print extract_expression(label) 
       exp = extract_expression(label) 
       path.append(exp) 
       if child not in visited: 
        yield parent,child  
        visited.add(child) 
        stack.append((child,iter(G[child]))) 
      except StopIteration: 
       stack.pop() 
    return path 

作る

return path 
SyntaxError: 'return' with argument inside generator 
+1

ジェネレータは、アイテムを 'yield'で1つずつ返します。 'return'はありません。 –

+0

extract_expressionは何をしますか? –

+0

@JayParikh:私の仕事のために元の文字列から部分文字列を抽出するだけの機能 – xtiger

答えて

2

にジェネレータ関数を、エラーをスローする必要があり、常に歩留まりその結果。

return pathyield pathに置き換えても問題ありませんが、全体的に一貫性がありません。 あなたはparent, childを返し、一度に突然リストを取得します。

+0

はい、このコードを変更する他の方法はありますか?リストを返すだけだからです。 – xtiger

+0

はい、 'yield parent、child'ステートメントを削除し、' return path'を最後に置いてください。 :) – Nether

関連する問題