Re[3]: [Python] Функция двойного назначения (generator/callback)
От: watchmaker  
Дата: 05.05.20 23:50
Оценка: 11 (2)
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.