2017-03-09 5 views
1

Ich habe eine einfache Baumklasse und muss nur über die Blattknoten iterieren können.Wie gebe ich einen Wert zurück, mache aber weiter

füge ich die Daten zu meinem Baum wie folgt:

p = ParamTree() 
p.add('system.screen.timeout') 
p.add('system.screen.lock.enabled') 
p.add('system.screen.lock.code') 

und ich möchte in der Lage sein timeout zu bekommen, enabled und code in Folge.

Wenn ich eine Funktion schreiben, um die Werte zu drucken, funktioniert es wie erwartet:

def print_nodes(tree): 
    for node in tree.nodes: 
     if node.has_children(): 
      print_nodes(node) 
     else: 
      print(node) 

Ausgang:

>>> print_nodes(p) 
timeout 
enabled 
code 

Wie würde ich einen Generator Umsetzung gehen über, die das gleiche tut? Ich habe versucht, print() durch yield zu ersetzen, aber es funktioniert nicht.

def yield_nodes(tree): 
    for node in tree.nodes: 
     if node.has_children(): 
      yield_nodes(node) 
     else: 
      yield node 

Ausgang:

>>> g = yield_nodes(p) 
>>> for n in g: 
... print(n) 
... 
>>> 

Antwort

2

Ich werde Ihr yield_nodes Generator anzunehmen, geschrieben werden, wie folgt:

def yield_nodes(tree): 
    for node in tree.nodes: 
     if node.has_children(): 
      yield_nodes(node) 
     else: 
      yield node 

Wie Sie vielleicht bemerkt, ruft yield_nodes kehrt ein Generator (das Du könntest über iterieren), aber du tust nichts damit. Meine vorgeschlagene Lösung wäre die folgende:

def yield_nodes(tree): 
    for node in tree.nodes: 
     if node.has_children(): 
      yield from yield_nodes(node) 
     else: 
      yield node 
Verwandte Themen