【问题标题】:How to find out the default values of a particular function's argument in another function in Python?如何在 Python 中的另一个函数中找出特定函数参数的默认值?
【发布时间】:2011-06-19 02:26:12
【问题描述】:

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

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

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

【问题讨论】:

  • 我可以把它改成 Wiki 吗?我不知道该怎么做。我问了这个问题后不久就找到了答案,所以既然我自己回答了自己的问题,最好还是把它做成一个wiki。
  • @Josh:谢谢。从邓肯那里得到了一个更好的答案,并将其标记为已接受的答案。

标签: python introspection default-parameters


【解决方案1】:

作为一种替代方法,您可以使用检查模块来获得更友好的界面:

对于 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',))

【讨论】:

  • 这样更好,因为您还可以获得变量名及其默认值(如果存在)!
  • 请注意,自 Python 3.0 起已弃用,取而代之的是 inspect.getfullargspec
【解决方案2】:

如果你像这样定义一个函数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')

【讨论】:

  • 看看邓肯的回答,比这个好多了。
【解决方案3】:

我的错。当然,还有myFunction.func_defaults。

【讨论】:

    【解决方案4】:

    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'
    

    【讨论】:

      猜你喜欢
      • 2016-05-03
      • 2019-04-14
      • 2014-10-12
      • 2017-02-03
      • 2012-09-06
      • 1970-01-01
      • 2021-02-23
      • 2023-03-11
      相关资源
      最近更新 更多