获取Python函数所需的参数

时间:2014-09-26 15:01:24

标签: python python-3.x abstract-syntax-tree

是否有办法(最好使用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()之类的函数没有什么不同,后者不需要特定数量的参数。

1 个答案:

答案 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