如何检查函数/方法接受哪些参数?
为了让我正在用Python构建的几个模块保持一致,我想做一些自动化的代码检查。为此,我想检查这些模块里的函数以及这些函数需要的参数。我可以用hasattr()来检查模块里是否真的包含了我期待的函数。到这里一切都还不错。
现在我想看看这些函数需要哪些参数。只要能看到变量的名字就够了。不过我不知道该怎么做。有没有人知道我该如何获取一个函数的参数名字呢?
1 个回答
40
你可以使用 inspect.getargspec()
来查看一个函数接受哪些参数,以及关键词参数的默认值是什么。
示例:
>>> def foo(bar, baz, spam='eggs', **kw): pass
...
>>> import inspect
>>> inspect.getargspec(foo)
ArgSpec(args=['bar', 'baz', 'spam'], varargs=None, keywords='kw', defaults=('eggs',))
>>> inspect.getargspec(foo).args
['bar', 'baz', 'spam']
在 Python 3 中,你应该使用 inspect.getfullargspec()
,因为这个方法支持 Python 3 新增的函数参数特性:
>>> def foo(bar: str, baz: list, spam: str = 'eggs', *, monty: str = 'python', **kw) -> None: pass
...
>>> import inspect
>>> inspect.getfullargspec(foo)
FullArgSpec(args=['bar', 'baz', 'spam'], varargs=None, varkw='kw', defaults=('eggs',), kwonlyargs=['monty'], kwonlydefaults={'monty': 'python'}, annotations={'baz': <class 'list'>, 'return': None, 'spam': <class 'str'>, 'monty': <class 'str'>, 'bar': <class 'str'>})
inspect.getargspec()
在 Python 3 中已经不推荐使用了。
Python 3.4 还新增了 inspect.Signature()
对象:
>>> inspect.signature(foo)
<inspect.Signature object at 0x100bda588>
>>> str(inspect.signature(foo))
"(bar:str, baz:list, spam:str='eggs', *, monty:str='python', **kw) -> None"
>>> inspect.signature(foo).parameters
mappingproxy(OrderedDict([('bar', <Parameter at 0x100bd67c8 'bar'>), ('baz', <Parameter at 0x100bd6ea8 'baz'>), ('spam', <Parameter at 0x100bd69f8 'spam'>), ('monty', <Parameter at 0x100bd6c28 'monty'>), ('kw', <Parameter at 0x100bd6548 'kw'>)]))
还有很多其他有趣的选项可以用来处理函数的签名。