9

假设我们有一个这样的函数:

def myFunction(arg1='a default value'):
  pass

我们可以使用自省来找出myFunction()使用 using的参数的名称myFunction.func_code.co_varnames,但是如何找出arg1'a default value'在上面的示例中)的默认值?

4

4 回答 4

10

如果你定义一个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')
于 2011-02-01T09:14:10.053 回答
10

作为根植于函数属性的替代方法,您可以使用检查模块以获得稍微友好的界面:

对于 Python 3.x 解释器:

import inspect
spec = inspect.getfullargspec(myFunction)

然后 spec 是一个FullArgSpec具有属性的对象,例如argsdefaults

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具有属性的对象,例如argsdefaults

ArgSpec(args=['arg1'], varargs=None, keywords=None, defaults=('a default value',))
于 2011-02-01T09:36:01.177 回答
0

我的错。当然,有myFunction.func_defaults

于 2011-02-01T07:33:47.207 回答
0

还提供了一种迭代函数参数的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'
于 2020-02-24T02:58:40.123 回答