вызывая выход для генератора в другой функции

Предположим, у меня есть какой-то объект менеджера. 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 такое решение?

Ответы на вопрос(5)

Ваш ответ на вопрос