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 .