J>Да, у меня такое есть уже. Хотелось избавиться от yield, чтоб вместо yield был типа вызов коллбека.
J>Я так понимаю, это невозможно по дизайну языка, чисто потому, что есть inspect.isgeneratorfunction.
Проблема в другом: если это callback, то функция f может его куда-то передать (например, в недра 3rd-party библиотеки, которая не обязательно даже на чистом python написана). Аналогично, полученный генератор тоже можно куда-то передать (в недра другой 3rd-party библиотеки).
Соответственно, каждый вызов next() от генератора должен приводить к переключению из одной части несвязанного кода в другую и обратно. Можно сказать, что нужно иметь одновременно два стека вызовов. В одном потоке CPython так не умеет.
Но это легко делается либо в Stackless Python: нет стека — нет проблем :)
Либо это делается запуском функции в отдельном потоке: два потока — два стека.
(во втором случае, просто создаём очередь из одного элемента, запускаем функцию в потоке и в качестве коллбека передаём метод "положи в очередь", после выхода из функции очередь закрываем; в основном же потоке сразу же возвращаем генератор, который вычитывает элементы из очереди пока они не закончатся)