Скомпилируйте AST Python в метод

Я экспериментировал с AST в python. Я хочу изменить методы, преобразовав AST во время выполнения.

Я могу получить исходный код предварительно скомпилированного метода, используя inspect.getsource () , и Я могу изменять AST по мере необходимости, используя посетителей AST.

Это, вероятно, довольно наивно, но я бы хотел иметь возможность скомпилировать AST и сделать что-то вроде:

myClass.method.__func__.__code__ = compile(newAST, '<string>', 'exec')

Но компиляция будет принимать только AST с аст.модуль как root. Есть ли способ либо скомпилировать просто ast.FunctionDef, либо получить объект кода функции из скомпилированного (и в противном случае пустого) кода модуля?

Приветствуются любые указатели на информацию, касающуюся подобных вещей. Примеры AST, которые я видел, имеют дело только с простыми выражениями.


Я понял, что мне нужно просто выполнить модуль в пространстве имен, тогда у меня будет доступ к нормальной структуре. Итак, образец такой:

src = inspect.getsource(myClass.myMethod)
astFromSrc = ast.parse(unindent(src))         # need to remove extra indent from method
transform(astFromSrc.body)                    # transform the AST as you need 
ast.fix_missing_locations(astFromSrc)         # fix up line numbers etc
compiled = compile(astFromSrc, '<string>', 'exec') # compile the module AST

#######  From here is the part I was missing
myScope = {}                                  # make an empty namespace
exec compiled in myScope  # now myScope contains a proper compiled function

# Now replace the original with the modified version
myClass.myMethod.__func__.__code__ = myScope['myMethod'].__code__

Но теперь у меня есть другой вопрос: Как вставить это в обычный процесс сборки Python, чтобы изменения выполнялись только один раз, а затем загружались из файла .pyc?

10
задан Kev 15 August 2011 в 22:36
поделиться