Типичные декораторы Python
- получают декорированную, скомпилированную функцию или class в качестве аргумента
- обрабатывают ее
- возвращение изменено или упаковано, скомпилировано функция или класс
например, :
def decorate(f):
print("wrapping {}".format(f.__name__))
def wrapper():
print("executing {}".format(f.__name__))
f()
return wrapper
@decorate
def f():
print("here is f")
# wrapping f
f()
# executing f
# here is f
Ради (чистого, чистого, безопасного, клянусь) ради эксперимента и любопытства интересно, существует ли что-то вроде декоратора python, который вместо этого
- получает / обрабатывает / возвращает литеральный питон script или AST , перед фактически скомпилировано в байт-код.
Так что редактирование может быть выполнено в классе или функциискрипт во время оформления.
например :
import ast
def hook_decorate(tree):
print("editing ast {}".format(ast.dump(tree)))
tree.body[0].value.n = 8
print("to {}".format(ast.dump(tree)))
print("before compilation.")
return tree
@hook_decorate
def f():
a = 5
print(a)
# editing ast Module(body=[Assign(targets=[Name(id='a', ctx=Store())], value=Num(n=5)), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[]))])
# to Module(body=[Assign(targets=[Name(id='a', ctx=Store())], value=Num(n=8)), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[]))])
# before compilation.
f()
# 8
Возможно ли это?Если да, то как?
Другими словами: как мне перехватить процедуру интерпретации определения функции (синтаксический анализ, компиляция)?
[ОБНОВЛЕНИЕ]: я знаю, что возможно проанализироватьвесь файл модуля для @hook_decorate
токенов и обработайте соответствующий ast перед его фактическим импортом.Но это не совсем то же самое.