我正在尝试使用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
作为示例。
答案 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?