2016-06-15 15 views
0

Ich habe eine Python-Funktion, die einen Satz als Baum durchsucht nach Adjektiv/Nomen-Paaren (wie "gute Katze"), erstellt eine Liste solcher Paare und gibt sie zurück. Hier ist sie:Verstehe nicht, warum diese Python-Funktion eine None zurückgibt, während sie definitiv keine lokale None ist.

def traverse(t): 
    thelist = list() 
    try: 
     t.label() 
    except AttributeError: 
      return 
    else: 
     if t.label() == 'NP': 
      for leaf in t.leaves(): 
        thelist.append(str(leaf[0])) 
      print("The list is ",thelist) 
      return thelist 
     else: 
      for child in t: 
        traverse(child) 

ich diese Funktion aufrufen wie so:

print("traversing the tree returned ",traverse(pos_parser)) 

Was ich bekommen, ist dies:

The list is ['good', 'cat'] 
traversing the tree returned None 

So schafft es und druckt Variable "thelist" in Traverse gibt es aber nicht zurück (gibt stattdessen None zurück). Warum??

Kann mir bitte jemand helfen?

+2

Mögliche Duplikat [rekursive Code gibt None] (http://stackoverflow.com/q/22311440/953482) – Kevin

+2

Hinweis: die Rückkehr in das Attribut Fehler implizit gibt keine zurück –

+0

Haben Sie versucht, in einem Debugger schrittweise zu gehen? Wird die AttributeError-Ausnahme ausgelöst? –

Antwort

0

Ich vermute, dass Sie zum ersten Mal durch die traverse Funktion, die letzte Zeile, die rekursiv ruft traverse ruft. Sie tun jedoch nichts mit der Ausgabe dieses Aufrufs. Meine Vermutung ist, dass Sie die letzte Zeile ändern müssen, um die Ausgabe der Polygonzüge zu erfassen und schließlich die Liste zurückzugeben.

So wie Sie sind, rufen Sie nur return auf Ihren Blattknotenaufrufen an.

Etwas wie folgt aus:

def traverse(t): thelist = list() try: t.label() except AttributeError: return else: if t.label() == 'NP': for leaf in t.leaves(): thelist.append(str(leaf[0])) print("The list is ",thelist) return thelist else: for child in t: thelist.append(traverse(child)) return thelist

Verwandte Themen