我正在尝试使用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?