Python ast - 获取函数参数并处理它们

问题描述 投票:0回答:1

我正在尝试使用Python中的ast模块来解析输入代码,但我正在努力解决如何执行此操作的大量语法。例如,我将以下代码作为测试环境:

import ast


class NodeVisitor(ast.NodeVisitor):
    def visit_Call(self, node):
        for each in node.args:
            print(ast.literal_eval(each))
        self.generic_visit(node)


line = "circuit = QubitCircuit(3, True)"
tree = ast.parse(line)

print("VISITOR")
visitor = NodeVisitor()
visitor.visit(tree)

输出:

VISITOR
3
True 

在这种情况下,请纠正我,如果我错了,如果是函数调用,将使用visit_Call吗?所以我可以得到每个参数,但不能保证它会像这样工作,因为可以提供不同的参数。我知道node.args提供了我的参数,但我不确定如何用它们做什么?

我想我要问的是如何检查参数是什么,并用它们做不同的事情?或许,我想检查第一个参数是否为Int,如果是,请运行processInt(parameter)作为示例。

python abstract-syntax-tree
1个回答
2
投票

方法循环中的值each将被分配给您访问的每个函数调用中的每个参数的AST节点。有许多不同类型的AST节点,因此通过检查您拥有哪种类型,您可以了解有关传入的参数的信息。

但请注意,AST是关于语法,而不是值。因此,如果函数调用是foo(bar),它只会告诉你参数是一个名为bar的变量,而不是该变量的值(它不知道)。如果函数调用是foo(bar(baz)),它将向您显示该参数是另一个函数调用。如果你只需要用文字作为参数来处理调用,那么你可能会好起来,你只需看看AST.Num和类似的实例。

如果要检查第一个参数是否为数字并进行处理,则可以执行以下操作:

def visit_Call(self, node):
    first_arg = node.args[0]
    if isinstance(first_arg, ast.Num):
        processInt(first_arg.n)
    else:
        pass  # Do you want to do something on a bad argument? Raise an exception maybe?
© www.soinside.com 2019 - 2024. All rights reserved.