【问题标题】:How to default to the default argument in Python如何在 Python 中默认为默认参数
【发布时间】:2015-02-17 21:55:34
【问题描述】:

假设我有一个函数:

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?

【问题讨论】:

  • self.c 和 self.b 是什么?
  • 它们可能是很多东西。也许最初是空的但可以附加到的字符串。

标签: python python-2.7


【解决方案1】:

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

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

【讨论】:

    【解决方案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))
    

    【讨论】:

    • 我总是喜欢更简洁的c = c or 'something' 表述。
    • @acushner,是的,在使用它时我有一点心理障碍,但是它会起作用,我会添加它
    • 我觉得x if x else y 结构更符合习惯。
    • @AndrewGorcester,我也觉得使用它更舒服,但我想在这种情况下它们是等价的,因为我们没有检查 ` if x is not None` 等。
    【解决方案3】:

    你可以在这里使用**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()

    【讨论】:

    • 这不会做正确的事情。因为如果 self.d 被设置,但 self.c 不是,那么在位置上,c 将被分配 self.d,这似乎与提问者的愿望背道而驰。
    • @jgritty:谢谢,已修复。
    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 2013-02-20
    • 2019-12-14
    • 2020-09-04
    • 2016-01-06
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多