Digamos que tengo dos funciones:En python, ¿hay alguna forma de comprobar si una función es una "función del generador" antes de llamarla?
def foo():
return 'foo'
def bar():
yield 'bar'
El primero de ellos es una función normal, y la segunda es una función de generador. Ahora quiero escribir algo como esto:
def run(func):
if is_generator_function(func):
gen = func()
gen.next()
#... run the generator ...
else:
func()
¿Cómo será una aplicación directa de is_generator_function()
parece? Usando el paquete types
puedo probar si gen
es un generador, pero deseo hacerlo antes de invocar func()
.
Ahora consideremos el siguiente caso:
def goo():
if False:
yield
else:
return
Una invocación de goo()
devolverá un generador. Supongo que el analizador de Python sabe que la función goo()
tiene una declaración de rendimiento, y me pregunto si es posible obtener esa información fácilmente.
Gracias!
Es útil tener en cuenta que si una función contiene una declaración 'yield', a continuación, un' retorno 'declaración dentro de esa función no tiene permiso para tener un argumento. Tiene que ser simplemente 'return' que termina el generador. ¡Buena pregunta! –
Buen punto, 'goo()' no debería ser válido, como sea, al menos aquí (Python 2.6.2). – Carlos
Una nota para los lectores actuales: @GregHewgill comentario anterior ya no es correcto, ahora puede volver con el argumento (que se pasa en el valor atr de StopIteration) – wim