用Python中的函数调用替换表达式

时间:2014-07-16 03:17:54

标签: python

上下文和Verbiage

您好,我想与您分享我整个周末都在努力解决的所有问题。

如果您正在运行自定义Python解释器,则可能需要一种方法来捕获表达式的值 - 即未分配给任何变量的值,例如x**2,但与y = x**2不同。我不会详细介绍,但有一种可能性是用一个函数替换编译器,该函数将命令解析为abstract syntax tree,并用你选择的函数替换,原始表达式作为参数。< / p>

实际问题

如果我有一行Python代码我知道是完整的,如何使用函数调用(x**2而不是y = x**2) >即 record(x**2))?

1 个答案:

答案 0 :(得分:0)

此问题的解决方案围绕abstract syntax trees。它们可用于以编程方式描述Python代码。例如,通过ast.parse()解析时,我们可以看到x**2等表达式表示为asp.Expr个对象。

获得具有ast.parse()的树对象后,您可以定义一个类和函数来对树进行爬网并执行修改。例如,这段代码将使用该表达式作为参数,用方法调用__recorder__.record()替换每个未捕获的表达式。

class CaptureExprs(ast.NodeTransformer):
    def visit_Expr(self, node):
        newnode = ast.copy_location(
            ast.Expr(
                value=ast.Call(
                    func=ast.Attribute(
                        value=ast.Name(
                            id='__recorder__',
                            ctx=ast.Load()
                        ),
                        attr="record",
                        ctx=ast.Load()
                    ),
                    args=[node.value],
                    keywords=[],
                    starargs=None,
                    kwargs=None
                )
            ),
            node
        )
        ast.fix_missing_locations(newnode)
        return newnode