Giocando intorno con alberi, mi sono imbattuto su questo comportamento:vuoto generatore
def descendants (self):
return #or "pass" or "42"
restituisce ovviamente None
.
D'altro lato:
def descendants (self):
return
yield 42
restituisce un generatore che produce niente (in realtà il comportamento che mi serviva per nodi foglia).
Qualcuno potrebbe spiegarmi cosa sta succedendo sotto il cofano qui?
Il codice yield 42
non dovrebbe essere irraggiungibile? (Suppongo che la decisione se una funzione sia un generatore o una funzione "normale" venga eseguita in fase di compilazione, a seconda che contenga una o varie affermazioni yield
, siano esse raggiungibili o meno. Ma questo è solo uno sparo nell'oscurità .)
Il contesto è il seguente: Ho alberi e ogni nodo è un albero o una foglia. Ora voglio generare tutti i discendenti di un nodo:
class Leaf (Node):
@property
def descendants (self):
return
yield 42
class Tree (Node):
@property
def descendants (self):
for child in self.children:
yield child
yield from child.descendants
Io di solito solo 'return()', poiché agisce come un generatore vuoto. – U2EF1