如何检查函数/方法采用哪些参数?

kra*_*r65 3 python arguments function code-inspection

为了保持几个模块,我在Python中构建有点一致,我想做一些自动代码检查.为此,我想检查模块的功能和函数所采用的参数.我可以使用hasattr()来检查模块是否实际包含预期的函数.到现在为止还挺好.

我现在想看看函数采用哪些参数.只需查看变量名就足够了.我不知道我怎么能这样做.有人知道如何获取函数所带参数的名称吗?

Mar*_*ers 6

您可以使用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']
Run Code Online (Sandbox Code Playgroud)

在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'>})
Run Code Online (Sandbox Code Playgroud)

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'>)]))
Run Code Online (Sandbox Code Playgroud)

还有许多有趣的选项可以与签名一起玩.

  • 你可能要提一下,在Python 3.x中,[函数]已弃用[https://docs.python.org/3/library/inspect.html#inspect.getargspec],有利于[`inspect.getfullargspec`] (https://docs.python.org/3/library/inspect.html#inspect.getfullargspec). (3认同)