如何在python函数中明确指出命名参数的默认值的使用?

时间:2017-05-11 10:16:35

标签: python

是否可以显式告诉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

在这个例子中,我想避免多次定义默认值。

3 个答案:

答案 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
>>>