Python AST-获取函数参数并对其进行处理

时间:2019-04-19 19:51:24

标签: python abstract-syntax-tree

我正在尝试使用Python中的using Newtonsoft.Json; public class Publication { [Key] public int PublicationID { get; set; } public string PublicationTitle { get; set; } public string Frequency { get; set; } public DateTime NextIssueDate { get; set; } public DateTime SpaceDeadline { get; set; } public DateTime MaterialsDeadline { get; set; } [JsonIgnore] public DateTime CreatedDt { get; set; } [JsonIgnore] public string CreatedBy { get; set; } [JsonIgnore] public DateTime UpdatedDt { get; set; } [JsonIgnore] public string UpdatedBy { get; set; } } 模块来解析输入代码,但是却在如何使用语法上有很多困难。例如,我有以下代码作为测试环境:

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)

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

我想我要问的是如何检查自变量,并对它们进行不同的处理?我想检查一下,第一个参数是一个Int,如果是,请运行VISITOR 3 True 作为示例。

1 个答案:

答案 0 :(得分: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?