вызывая выход для генератора в другой функции
Предположим, у меня есть какой-то объект менеджера. API этого объекта имеетmain_hook
функция, которая получает другую функциюf
в качестве аргумента, и запускает данныйf
в цикле, делая некоторые вещи между каждой итерации:
def main_hook(self,f):
while (self.shouldContinue()):
#do some preparations
f(self)
#do some tear down
Теперь у меня тоже есть (точнее,хотел бы иметь) функцияstop_and_do_stuff
, что когда-то звонил, останавливаетсяmain_hook
мертвый в своих треках, возвращает управление тому, что называется funcmain_hook
и после того, как эта функция закончит работу, верните управление main_hook и продолжайте. В основном результат будет таким же, как и
def main_hook(self,f):
while (self.shouldContinue()):
#do some preparations
yield
#do some tear down
За исключением того, что вместоyield
Я хочу позвонитьf()
, даваяf
возможность позвонитьself.stop_and_do_stuff()
I не может Обойти это можно, сделав f также генератором по 2 причинам:
1.f
не является частью моего API - он предоставлен мне пользователем, который использует мою библиотеку
2.Даже если можно будет попросить его использовать yield, то место в коде, в которое ему нужно будет позвонитьstop_and_do_stuff
не будет непосредственно внутри f, скорее в каком-то месте в стеке функций, который будет внутриf()
но не непосредственно в нем, например
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)
так что если я решу сделатьf
генератор, мне тоже нужно сделатьg
генератор, а такжеh
иначе этот трюк не сработает.
Есть ли решение для всего этого? может я пытаюсь решить это не так?
(Я знаю, что этот вопрос длинный и безобразный - это лучшее, что я мог сделать. Если что-то не понятно, пожалуйста, скажите мне, и я уточню это)
РЕДАКТИРОВАТЬМожет бытьПеп 342 такое решение?