Предположим, у меня есть некоторый объект-менеджер. 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
мертвых в своих дорожках, возвращает элемент управления в зависимости от того, какой func называется main_hook
, и после этого func закончил то, что он делает, получить управление обратно в 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()
Я не могу работа вокруг этого путь п также генератор для 2 причин:
1. f
не является частью моей API - это дала мне пользователь, который использует мой LIB
2. Даже если вы можете попросить его использовать доходность, то место в коде, в котором ему нужно будет позвонить 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
, иначе этот трюк не будет работать.
Есть ли решение для всего этого? может быть, я пытаюсь решить это неправильно?
(я знаю, что этот вопрос давно и некрасиво - это лучшее, что я мог бы сделать Если что-то не ясно, пожалуйста, скажите мне, и я поясню это.)
EDIT
Может pep 342 это решение?
У меня такое же понимание, как у Анурага, а также думаю (как он), что вы действительно не задавали вопрос, а предоставляли элементы своего собственного решения (это еще не работает). Поэтому лучшее, что вы можете ожидать, это заставить ваше решение работать, а не получать действительно pythonic решение. Кроме того, из того, что я видел в этом вопросе, у меня странное чувство. Мне кажется странным говорить о функциях как о «выполнении чего-то», а не о «возвращении результата», похоже на то, что вы делаете, это в основном какой-то интерактивный побочный эффект. Это ? – kriss
мне непонятно, что если f является чужой функцией lib, то как она может вызвать stop_and_do_stuff в середине, и если она может это сделать, почему она не может уступить? –
@ Anurag-f получает объект 'manager' как аргумент, и он имеет функцию stop_and_do_stuff – olamundo