Accessing the default argument values in Python

2020-07-11 04:34发布

How can I programmatically access the default argument values of a method in Python? For example, in the following

def test(arg1='Foo'):
    pass

how can I access the string 'Foo' inside test?

标签: python
4条回答
Melony?
2楼-- · 2020-07-11 05:12

Consider:

def test(arg1='Foo'):
    pass

In [48]: test.func_defaults
Out[48]: ('Foo',)

.func_defaults gives you the default values, as a sequence, in order that the arguments appear in your code.

Apparently, func_defaults may have been removed in python 3.

查看更多
▲ chillily
3楼-- · 2020-07-11 05:12

This isn't very elegant (at all), but it does what you want:

def test(arg1='Foo'):
    print(test.__defaults__)

test(arg1='Bar')

Works with Python 3.x too.

查看更多
在下西门庆
4楼-- · 2020-07-11 05:15

They are stored in test.func_defaults (python 2) and in test.__defaults__ (python 3).

As @Friedrich reminds me, Python 3 has "keyword only" arguments, and for those the defaults are stored in function.__kwdefaults__

查看更多
兄弟一词,经得起流年.
5楼-- · 2020-07-11 05:25

Ricardo Cárdenes is on the right track. Actually getting to the function test inside test is going to be a lot more tricky. The inspect module will get you further, but it is going to be ugly: Python code to get current function into a variable?

As it turns out, you can refer to test inside the function:

def test(arg1='foo'):
    print test.__defaults__[0]

Will print out foo. But refering to test will only work, as long as test is actually defined:

>>> test()
foo
>>> other = test
>>> other()
foo
>>> del test
>>> other()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in test
NameError: global name 'test' is not defined

So, if you intend on passing this function around, you might really have to go the inspect route :(

查看更多
登录 后发表回答