编译前检索函数ast

时间:2019-01-23 13:38:31

标签: python-3.x parsing compilation metaprogramming abstract-syntax-tree

典型的python装饰器

  • 将修饰后的编译后的 function class 接收为参数
  • 处理
  • 返回修改或包装的编译后的 function 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

这可能吗?如果可以,怎么办?
换句话说:如何挂钩函数定义解释程序(解析,编译)?


[UPDATE]:我知道可以在整个模块文件中解析@hook_decorate令牌并在实际导入之前处理相应的ast。但这不是完全一样。

0 个答案:

没有答案