Но, я уверен, тут нужно смотреть в сторону модификации абстрактного синтаксического дерева (AST), а не байт-кода. Для этого есть модуль docs.python.org/library/ast.html
Допустим, если встретили в AST функцию, обернутую в декоратор с именем @shortgen, то ищем в её теле оператор бинарного сдвига и заменяем его на yield + Task.
Из плюсов:
* лучшая переносимость между версиями (т.к. формат AST документирован, а байт-код может изменяться без предупреждения)
* трансформация происходит в момент «компиляции» а не в момент импорта (т.е. в .pyc файле будет уже yield).
* код AST-трансформации по идее должен быть гораздо проще
* не нужно ничего манкипатчить
* проблемы со сложной декомпозицией и установкой результата «не-переменным» должны отпасть.
Из минусов — я не знаю есть ли возможность применять AST трансформацию автоматически, скорее всего нужно писать Мakefile и компилировать .pyo отдельно. К сожалению, в Python нет опций компилятора, как в Erlang parse_transform например.
Может попробуете на досуге? ;-)
Но вообще очень интересный способ, спасибо! Как в NodeJS без yield живут не понимаю.
Самая короткая запись асинхронных вызовов в tornado или патчим байткод в декораторе