Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, koenjihyakkei, Вы писали:
K>>Можно сделать враппер
J>Да, я сейчас именно так и делаю (у меня это обобщенная функция call_with_cb(cb, f, *args, **kwargs), которая работает с любой функцией-генератором), но это внешнее, а хотелось бы что-то внутри самой функции написать
Казалось бы, чтобы снаружи не писать
call_with_cb, придумали декораторы:
def with_optional_callback(callback_argument_name):
def decorator(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
cb = kwargs.pop(callback_argument_name, None)
seq = f(*args, **kwargs)
if cb is None:
return seq
else:
for item in seq:
cb(item)
return wrapper
return decorator
@with_optional_callback("cb")
def f():
x=1
yield x
x=2
yield x
Теперь вызов
f() вернёт генератор, а вызов
f(cb=print) позовёт callback.