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

Python ast - getting function parameters and processing them

我正在尝试使用 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) 为例。

方法循环中的值 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?