是否可以显式告诉python中的函数使用参数的默认值?
例如,如果函数定义为:
def foo(a=1, b=2, c=3):
pass
我想把这个函数称为:
foo(a=3, b=<USE-DEFAULT>, c=10)
^
|
应该相当于:
foo(a=3, c=10)
一个用法示例是使用函数来实例化类的实例:
class foo():
def __init__(a=1, b=2, c=3):
self.a = a
self.b = b
self.c = c
def create_foo(a=None, b=None, c=None):
f = foo( <PASS ALL EXCEPT NONE> )
F = create_foo(a=10, c=30)
# Then F should have a=10, b=2, c=30
在这个例子中,我想避免多次定义默认值。
答案 0 :(得分:3)
只需将该功能称为
即可foo(a=3, c=10)
或者,您可以使用以下方法,例如,列表所必需的,因为默认值在模块范围内计算:
def foo(a=None, b=None, c=None):
local_a = a or "default"
...
foo(a=42, b=None, c=16)
None
然后编码使用默认值,如果None
无效选项。
最后,您可以将默认值定义为“常量”:
DEFAULT_A = 42
DEFAULT_B = "foo"
DEFAULT_C = 17
def foo(a=DEFAULT_A, b=DEFAULT_B, c=DEFAULT_C):
pass
foo(16, DEFAULT_B, 123)
但这种情况非常罕见。
对于您更新的示例,我建议使用*
和**
运算符:
def create_foo(*args, **kwargs):
f = foo(*args, **kwargs)
create_foo(42, b="non-default")
有关这些运算符的工作原理,请参阅this question。
答案 1 :(得分:2)
如果你不使用* args和** kwargs和子类,没有理由显式调用默认值,只要你只使用你自己的类而你不需要相互默认的参数,你就可以移交与默认值相同的值 - 但是如果您正在使用* args和** kwargs并且要调用的方法来自超类,则可能会出现MRO问题。 (有关详细信息,请参阅此文章:https://www.python.org/download/releases/2.3/mro/)
我知道阻止a(此时未知)超类将参数传递给你的calss扩展的类的唯一方法是显式调用方法,而不是仅移交你想要它获取的参数。<登记/> 我没有看到显式默认调用的另一个用例。
答案 2 :(得分:0)
当defining
函数时,您可以设置默认值,因此当您call
函数时,您不需要将默认参数传递给函数。
def foo(a=1, b=<USE-DEFAULT>, c=3):
print(b)
foo(a=3, c=10)
在上面的函数foo
中,您实际上是为所有参数a,b,c设置default
值
示例:
>>> def foo(a=1, b=2, c=3):
... print('a: {0}, b: {1}, c: {2}'.format(a, b, c))
...
>>> foo(a=3, c=10)
a: 3, b: 2, c: 10
>>> foo()
a: 1, b: 2, c: 3
>>> foo(a=3)
a: 3, b: 2, c: 3
>>> foo(a=3, c=10, b=5)
a: 3, b: 5, c: 10
>>>