如何在Python中找到另一个函数中特定函数参数的默认值?

发布于 2024-10-15 20:20:19 字数 265 浏览 8 评论 0原文

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

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

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

Let's suppose we have a function like this:

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

We can use introspection to find out the names of the arguments that myFunction() takes using myFunction.func_code.co_varnames, but how to find out the default value of arg1 (which is 'a default value' in the above example)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

最初的梦 2024-10-22 20:20:19

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

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

As an alternative to rooting around in the attributes of the function you can use the inspect module for a slightly friendlier interface:

For Python 3.x interpreters:

import inspect
spec = inspect.getfullargspec(myFunction)

Then spec is a FullArgSpec object with attributes such as args and defaults:

FullArgSpec(args=['arg1'], varargs=None, varkw=None, defaults=('a default value',), kwonlyargs=[], kwonlydefaults=None, annotations={})

Some of these attributes are not available on Python 2 so if you have to use an old version inspect.getargspec(myFunction) will give you a similar value without the Python 3 features (getargspec also works on Python 3 but has been deprecated since Python 3.0 so don't use it):

import inspect
spec = inspect.getargspec(myFunction)

Then spec is an ArgSpec object with attributes such as args and defaults:

ArgSpec(args=['arg1'], varargs=None, keywords=None, defaults=('a default value',))
热情消退 2024-10-22 20:20:19

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

If you define a function f like this:

>>> def f(a=1, b=True, c="foo"):
...     pass
...

in Python 2, you can use:

>>> f.func_defaults
(1, True, 'foo')
>>> help(f)
Help on function f in module __main__:
f(a=1, b=True, c='foo')

whereas in Python 3, it's:

>>> f.__defaults__
(1, True, 'foo')
>>> help(f)
Help on function f in module __main__:
f(a=1, b=True, c='foo')
最丧也最甜 2024-10-22 20:20:19

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'

The inspect.signature also provides a nice way to iterate parameters of a function 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'
划一舟意中人 2024-10-22 20:20:19

我的不好。当然,还有myFunction.func_defaults

My bad. Of course, there's myFunction.func_defaults.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文