典型的python装饰器
例如:
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装饰器这样的东西
因此,可以在装饰期间在类或函数脚本中创建该版本。
例如:
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
这可能吗?如果可以,怎么办?
换句话说:如何挂钩函数定义解释程序(解析,编译)?
[UPDATE]:我知道可以在整个模块文件中解析@hook_decorate
令牌并在实际导入之前处理相应的ast。但这不是完全一样。