supongamos que tengo algún objeto de administrador. API de este objeto tiene una función main_hook
, que obtiene otra función f
ya que es el argumento, y corre el f
dada en un bucle, haciendo algunas cosas entre cada iteración:invocando el rendimiento de un generador en otra función
def main_hook(self,f):
while (self.shouldContinue()):
#do some preparations
f(self)
#do some tear down
Ahora, también tengo (más exactamente, desea tener) una función stop_and_do_stuff
, que una vez llamada, detiene main_hook
muerto en sus pistas, devuelve el control a cualquiera de las funciones llamadas main_hook
, y después de eso el func finalizó lo que está haciendo, recupera el control a main_hook y continúa. Básicamente, el resultado será el mismo que hacer
def main_hook(self,f):
while (self.shouldContinue()):
#do some preparations
yield
#do some tear down
excepto que en lugar yield
Quiero tener una llamada a f()
, al tiempo que f
la opción de llamar self.stop_and_do_stuff()
I no puede trabajo en torno a este f haciendo también un generador por 2 razones:
1. f
no es parte de mi API - se ha dado a mí por un usuario que utiliza mi lib
2. Aunque podría pedirle que use yield, el lugar en el código en el que necesitará llamar al stop_and_do_stuff
no estará directamente dentro de f, sino en algún lugar de la pila de funciones que estará dentro de f()
, pero no directamente en ella, por ejemplo
def h(manager):
#do stuff
if should stop:
manager.stop_and_do_stuff()
#do more stuff
def g(manager):
#some stuff
if should stop:
manager.stop_and_do_stuff()
#more stuff
if should stop again:
manager.stop_and_do_stuff()
if should call h:
h()
def f(manager):
g(manager)
así que si decido hacer f
un generador, también necesito hacer g
un generador y también h
, de lo contrario este truco no funcionará.
¿Hay alguna solución a todo esto? tal vez estoy tratando de resolverlo de la manera incorrecta?
(Sé que esta pregunta es largo y feo - es lo mejor que podría hacer si algo no está claro por favor dime y te aclaro.)
EDITAR
Tal pep 342 es la solucion?
Tengo el mismo entendimiento que Anurag y también pienso (como él) que realmente no hizo una pregunta pero proporcionó elementos de su propia solución (eso no funciona todavía). Entonces, lo mejor que puede esperar es lograr que su solución funcione, sin obtener una solución verdaderamente pitonica. Además, por lo que he visto en la pregunta, tengo una sensación extraña. Me parece extraño hablar de funciones como "hacer algo" en lugar de "devolver un resultado", parece que lo que estás haciendo es principalmente un efecto secundario interactivo. Lo es ? – kriss
no es claro para mí que si f es una función lib extranjera, ¿cómo puede llamar a stop_and_do_stuff en el medio y si puede hacerlo, por qué no puede ceder? –
@ Anurag-f obtiene un objeto 'manager' como argumento, y tiene la función stop_and_do_stuff – olamundo