Powiedzmy mam dwie funkcje:W pythonie istnieje sposób sprawdzenia, czy funkcja jest "funkcją generatora" przed wywołaniem?
def foo():
return 'foo'
def bar():
yield 'bar'
Pierwszy z nich to normalne funkcjonowanie, a druga jest funkcją generatora. Teraz chcę napisać coś takiego:
def run(func):
if is_generator_function(func):
gen = func()
gen.next()
#... run the generator ...
else:
func()
Co będzie prosta implementacja is_generator_function()
wyglądać? Korzystając z pakietu types
mogę przetestować, czy gen
jest generatorem, ale chcę to zrobić przed wywołaniem func()
.
Rozważmy teraz następujący przypadek:
def goo():
if False:
yield
else:
return
inwokacji z goo()
powróci generator. Zakładam, że parser Pythona wie, że funkcja goo()
ma deklarację zysku, i zastanawiam się, czy możliwe jest łatwe uzyskanie tych informacji.
Dzięki!
Jest to użyteczne, aby pamiętać, że jeśli funkcja zawiera 'yield' oświadczenie, a następnie' powrót 'Instrukcja wewnątrz tej funkcji nie może mieć argumentu. Musi to być po prostu 'return', który kończy generator. Dobre pytanie! –
Dobra rada, 'goo()' nie powinno być poprawne, jednak tak jest, przynajmniej tutaj (Python 2.6.2). – Carlos
Notatka dla obecnych czytelników: @GregHewgill komentarz powyżej nie ma już racji, teraz możesz powrócić z argumentem (który jest przekazywany na wartość attr w StopIteration) – wim