您好,我想与您分享我整个周末都在努力解决的所有问题。
如果您正在运行自定义Python解释器,则可能需要一种方法来捕获表达式的值 - 即未分配给任何变量的值,例如x**2
,但与y = x**2
不同。我不会详细介绍,但有一种可能性是用一个函数替换编译器,该函数将命令解析为abstract syntax tree,并用你选择的函数替换,原始表达式作为参数。< / p>
如果我有一行Python代码我知道是完整的,如何使用函数调用(x**2而不是y = x**2
) >即 record(x**2)
)?
答案 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