2012-08-22 5 views
8

Ho un generatore definita in questo modo:TypeError: oggetto 'generatore' non è richiamabile

def lengths(x): 
    for k, v in x.items(): 
     yield v['time_length'] 

e funziona, chiamandolo con

for i in lengths(x): 
    print i 

produce:

3600 
1200 
3600 
300 

quali sono i numeri corretti

Tuttavia, quando lo chiamo in questo modo:

somefun(lengths(x)) 

dove somefun() è definito come:

def somefun(lengths): 
    for length in lengths(): # <--- ERROR HERE 
     if not is_blahblah(length): return False 

ricevo questo messaggio di errore:

TypeError: 'generator' object is not callable 

Cosa sto equivoco ?

risposta

13

Non è necessario chiamare il generatore, rimuovere le staffe ().

Probabilmente siete confusi dal fatto che si usi lo stesso nome per la variabile all'interno della funzione come nome del generatore; il seguente funziona anche:

def somefun(lengen): 
    for length in lengen: 
     if not is_blahblah(length): return False 

Un parametro passato alla funzione somefun è quindi legato al lengen variabile locale invece di lengths, per mettere in chiaro che quella variabile locale non è la stessa cosa che la funzione lengths() voi definito altrove.

+0

Quel semplice huh ... :-D –

+0

@AmigableClarkKant, qual era la logica per mettere le parentesi lì, in primo luogo? – unkulunkulu

+0

@unkulunkulu: probabilmente confusione con il nome della funzione che produce il generatore. –