with - yield instruction python
¿Qué hace el rendimiento como tarea? myVar=(rendimiento) (2)
Estoy familiarizado con el rendimiento para devolver un valor gracias principalmente a esta pregunta
pero ¿qué hace el rendimiento cuando está en el lado derecho de una tarea?
@coroutine
def protocol(target=None):
while True:
c = (yield)
def coroutine(func):
def start(*args,**kwargs):
cr = func(*args,**kwargs)
cr.next()
return cr
return start
Me encontré con esto, en las muestras de código de este blog , mientras investigaba las máquinas estatales y las coroutines.
La declaración de yield
utilizada en una función convierte esa función en un "generador" (una función que crea un iterador). El iterador resultante normalmente se reanuda llamando a next()
. Sin embargo, es posible enviar valores a la función llamando al método send()
lugar de next()
para reanudarla:
cr.send(1)
En su ejemplo, esto asignaría el valor 1
a c
cada vez.
cr.next()
es efectivamente equivalente a cr.send(None)
Puede enviar valores al generador utilizando la función de send
.
Si ejecutas:
p = protocol()
p.next() # advance to the yield statement, otherwise I can''t call send
p.send(5)
entonces el yield
devolverá 5, por lo que dentro del generador c
será 5.
Además, si llama a p.next()
, el yield
devolverá None
.
Puedes encontrar más información here .