有没有办法(最好使用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()之类的函数没有什么不同。

最佳答案

您无法从调用表达式中看到可调用对象期望的参数。 Python在运行时将其完全留给了可调用对象。

对于静态代码分析,您唯一的选择是解析可调用对象(希望它本质上不是太动态,例如会在运行时更改),并且对于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

关于python - 获取Python函数所需的参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26062617/

10-08 22:32
查看更多