如何在Python中默认为默认参数

时间:2015-02-17 21:55:34

标签: python python-2.7

所以我想说我有一个功能:

def print_something(a, b, c='something', d='something else'):
    print '{}/{}/{}/{}'.format(a, b, c, d)

我有这种方法:

def print_method(self, a, b):
    if self.c and self.b:
        print_something(a, b, self.c, self.d)
    elif self.c:
        print_something(a, b, c=self.c)
    elif self.d:
        print_something(a, b, d=self.d)
    else:
        print_something(a, b)

有没有办法获得与print_method()相同的功能,而无需为self.c和self.d的每种可能组合提供if?

3 个答案:

答案 0 :(得分:4)

您可以将字典传递给包含关键字参数名称和值的函数调用。所以这样的事情应该有效:

kwargs = dict((k, getattr(self, k)) for k in ('c', 'd') if getattr(self, k))
print_something(a, b, **kwargs)

答案 1 :(得分:2)

您可以将其他功能设置值更改为空字符串,因此除非我们传入非空字符串,否则将使用默认值:

def print_something(a, b, c="", d=""):
    c = 'something' if not c else c
    d = 'something else' if not d else d
    print('{}/{}/{}/{}'.format(a, b, c, d))

def print_method(self, a, b):
        print_something(a, b, self.c, self.d)

或者更简洁,因为您认为在我们的班级中的if检查中任何假名值都是假的,我们可以使用c = c or default

def print_something(a, b, c="", d=""):
    c = c or 'something' 
    d = d or 'something else' 
    print('{}/{}/{}/{}'.format(a, b, c, d))

答案 2 :(得分:-1)

您可以在此处使用**args

def print_method(self, a, b):
    extra_args = {}
    if self.c:
        extra_args['c'] = self.c
    if self.d:
        extra_args['d'] = self.d
    print_something(a, b, **extra_args)

这会使print_something()调用你有多少额外的参数。