是否有办法(最好使用ast模块)知道某个函数是否具有所需数量的参数?
例如,如果用户界面允许用户插入python表达式,例如“sum(x)”,但是用户错误地键入了“sum()”,是否有办法在运行时验证该表达式?
我在符号树的每个节点上都调用了ast.dump,但这些符号的信息似乎不足以进行这种分析?
例如:
#own debug code added to ast.py
def visit(self, node):
print(dump(node),True, False)
method = 'visit_' + node.__class__.__name__
visitor = getattr(self, method, self.generic_visit)
return visitor(node)
的产率:
'Module(body=[Expr(value=Call(func=Attribute(value=Name(id='Math', ctx=Load()),
attr='cos', ctx=Load()), args=[Num(n=0.5)],
keywords=[], starargs=None, kwargs=None))])'
与print()之类的函数没有什么不同,后者不需要特定数量的参数。
答案 0 :(得分:1)
您无法从调用表达式中看到 callable 期望的参数。 Python在运行时将这完全留给了callable。
对于静态代码分析,您唯一的选择是解析callable(希望它本质上不是太动态,例如将在运行时更改),并且对于C定义的对象有自己的签名数据库。这是Komodo CodeIntel库采用的路径(OSS,用于其他项目,如SublimeCodeIntel)。 CIX files支持基于C的扩展,它基本上包含可调用签名。
在运行时,您可以使用inspect.signature()
来内省呼叫签名。目前仅部分支持C函数,只有使用Argument Clinic的人员才会存储签名信息,请参阅What are __signature__ and __text_signature__ used for in Python 3.4