假设我们有一个这样的函数:
def myFunction(arg1='a default value'):
pass
我们可以使用自省来找出myFunction()
使用 using的参数的名称myFunction.func_code.co_varnames
,但是如何找出arg1
('a default value'
在上面的示例中)的默认值?
假设我们有一个这样的函数:
def myFunction(arg1='a default value'):
pass
我们可以使用自省来找出myFunction()
使用 using的参数的名称myFunction.func_code.co_varnames
,但是如何找出arg1
('a default value'
在上面的示例中)的默认值?
如果你定义一个f
这样的函数:
>>> def f(a=1, b=True, c="foo"):
... pass
...
在 Python 2 中,您可以使用:
>>> f.func_defaults
(1, True, 'foo')
>>> help(f)
Help on function f in module __main__:
f(a=1, b=True, c='foo')
而在 Python 3 中,它是:
>>> f.__defaults__
(1, True, 'foo')
>>> help(f)
Help on function f in module __main__:
f(a=1, b=True, c='foo')
作为根植于函数属性的替代方法,您可以使用检查模块以获得稍微友好的界面:
对于 Python 3.x 解释器:
import inspect
spec = inspect.getfullargspec(myFunction)
然后 spec 是一个FullArgSpec
具有属性的对象,例如args
和defaults
:
FullArgSpec(args=['arg1'], varargs=None, varkw=None, defaults=('a default value',), kwonlyargs=[], kwonlydefaults=None, annotations={})
其中一些属性在 Python 2 上不可用,因此如果您必须使用旧版本inspect.getargspec(myFunction)
,则会在没有 Python 3 功能的情况下为您提供类似的值(getargspec
也适用于 Python 3,但自 Python 3.0 以来已被弃用,因此不要使用它) :
import inspect
spec = inspect.getargspec(myFunction)
然后 spec 是一个ArgSpec
具有属性的对象,例如args
和defaults
:
ArgSpec(args=['arg1'], varargs=None, keywords=None, defaults=('a default value',))
我的错。当然,有myFunction.func_defaults
。
还提供了一种迭代函数参数的inspect.signature
好方法https://docs.python.org/3/library/inspect.html#inspect.signature
import inspect
def f(*cake, one, two=None, three=3): pass
s = inspect.signature(f)
# <Signature (*cake, one, two=None, three=3)>
s.parameters['three'].default
3
s.parameters['cake'].kind
# <_ParameterKind.VAR_POSITIONAL: 2>
s.parameters['cake'].name
'cake'