Приветствую, коллеги!
Возник вопрос — можно ли написать функцию в Питоне, которая будет себя вести, в зависимости от аргумента, либо как генератор, либо как функция с коллбэком?
Что-то вроде:
def f(cb=None):
x=1
что-то(x, cb)
x=2
что-то(x, cb)
где "что-то" — это либо
yield x, если
cb is None, либо
cb(x)
Соответственно, я ее зову либо
for x in f(): print(x)
либо
f(cb=print)
и в том, и в другом случае она должна напечатать 1 и 2.
Функция f длинная, поэтому писать две версии, различающихся только yield/cb, не хочется (ну и вообще, DRY)
Интересует не только Python3, но и Python2, потому что основная кодовая база до сих пор на 2.7.
(Сейчас складывается впечатление, что если в тексте функции есть yield, то функция автоматически становится генератором, независимо ни от чего вообще, даже если этот yield гарантированно ни разу не позовется)