获取Python函数所需的参数

问题描述:

有没有一种方法(最好使用ast模块)知道函数是否具有所需数量的参数?例如,如果用户界面允许用户插入例如“sum(x)”的python表达式,但用户错误地键入了“sum()”,是否有一种方法可以在运行时验证该表达式?获取Python函数所需的参数

我已经在符号树的每个节点上都调用过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))])' 

并不真正喜欢从打印()函数不需要的参数的具体数量不同。

+2

您必须解析被调用的对象并分析* that *。在你实际执行调用之前,Python不知道这个*。 – 2014-09-26 15:03:48

+0

如何为Python函数定义“所需参数”?这个定义在哪里? – 2014-09-26 15:03:54

+2

我不想命名你的模块'ast.py'。 – roippi 2014-09-26 15:04:38

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

对于静态代码分析,唯一的选择是解析可调用对象(希望它本质上不是太动态,例如在运行时会改变),对于C定义的对象有自己的签名数据库。这是Komodo CodeIntel图书馆采用的路线(OSS,用于其他项目,如SublimeCodeIntel)。 CIX files支持基于C的扩展,它基本上包含可调用签名。

在运行时,您可以使用inspect.signature()来内省呼叫签名。 C功能目前仅得到部分支持,只有那些使用参数诊所的人才能存储签名信息,请参阅What are __signature__ and __text_signature__ used for in Python 3.4