如何指出函数应该使用其可选参数的默认值而不省略它?

时间:2017-06-26 09:40:32

标签: python optional-arguments

我正在尝试按照DRY原则编写不会重复的代码。

考虑一个带有许多参数的函数调用,包括强制参数和可选参数。在某些情况下,我想为可选参数指定一个值,而在其他情况下,我想将该值保留为其默认值。为了简化我的问题:

def func(a, b=2):
    print("b = {}".format(b))

avalue = 1
condition = 2
arg = None  # <-- Means: "use default" 
if condition == 1:
    arg = 3

func(avalue, b=arg)

输出

b = None

预期输出

b = 2

因此,我试图避免对函数调用进行两次编码:

if arg:
    func(avalue, b=arg)
else:
    func(avalue)

在Python中可以吗?

5 个答案:

答案 0 :(得分:4)

使用字典,如果要指定,只将可选参数设置为键值对。然后使用**kwargs调用语法应用字典:

avalue = 1
condition = 2

kwargs = {}
if condition == 1:
    kwargs['b'] = 3

func(avalue, **kwargs)

空字典(condition != 1个案例)将b设置为默认值。

答案 1 :(得分:1)

其中一个解决方案可以是:

def func(a, b=2, **kwargs):
    print("b = {}".format(b))

avalue = 1
condition = 2

func(avalue, **{} if condition != 1 else {'b':3})

答案 2 :(得分:0)

这个怎么样:

def func(a, b=None):
    b = 2 if not b else b
    print("b = {}".format(b))

avalue = 1
condition = 2
arg = None  # <-- Means: "use default"
if condition == 1:
    arg = 3

func(avalue, arg)  # b = 2

如果condition = 1

func(avalue, arg)  #  b = 3

以上假设您可以修改功能定义。如果不是这种情况,则必须使用**kwargs

答案 3 :(得分:0)

怎么样:

def func(a, b=None):
    if not b:
        b = 2
    print("b = {}".format(b))

avalue = 1
condition = 2
arg = None  # <-- Means: "use default" 
if condition == 1:
    arg = 3

func(avalue, b=arg)

此时默认情况并没有按原样使用, 当你有两种不同的方法时,通常会保留默认值,一种方法的另一种方式不应该用于交换机的加法/减法:

def maths(a,b,sub=false):
    result = a + b
    if sub:
        result = a - b
    return result

答案 4 :(得分:0)

Op提到函数func不能修改,所以我的建议是:

def func(a, b=2):
    print("b = {}".format(b))

avalue = 1
condition = 2
if condition == 1:
    func(avalue, b=3)
else:
    func(avalue)