如果在python方法调用中参数为None,则使用默认参数

ppa*_*ler 5 python

有点奇怪的问题,但是我在编码时偶然发现了这个问题。

这是我的代码

编辑:我添加了类以使我的结构更清晰

class Hidden(object):
    def x(self, aa, bb="John Doe"):
        print aa, bb

class Open(object):
    def __init__(self):
        self.h = Hidden()

    def y(self, a, b=None):
        # get rid of this if-else-foo
        if b is None:
            self.h.x(a)
        else:
            self.h.x(a, b)

o = Open()
o.y("Hello") # > Hello John Doe

o.y("Hello", "Mister X") # > Hello Mister X
Run Code Online (Sandbox Code Playgroud)

如果b是None(未设置),则我希望x不带参数的情况下调用方法(使用默认值)。

我想知道是否有办法摆脱if-else foo?

解

因为我只能接受一个答案,所以我可以说,所有列出的解决方案都有效。

这是给定答案的摘要:

  1. @邓肯:对我来说,这是实现我想要的最好的方法。
  2. @falsetru:这也是一种很好的方法,尽管我认为其中的方法*args很难阅读。
  3. @ peter-wood和@tgg:这两个版本都可以工作并保存3行代码。但是有一个if说法,我想避免。

Pet*_*ood 8

如果可以修改x:

def x(a, b=None):
    b = "John Doe" if b is None else b 
    print a, b
Run Code Online (Sandbox Code Playgroud)

  • @ioganegambaputifonguser,它将把空字符串(或任何其他虚假值)替换为“John Doe”。 (3认同)
  • b = b 或“约翰·多伊” (2认同)

Tho*_*son 5

如果你想摆脱“如果”就这样做

self.h.x(a, [b, 'Default Value'][b is None])
Run Code Online (Sandbox Code Playgroud)

附:这适用于 python3.5+,我不关心 python2.7


Dun*_*can 4

从您更新的类问题来看,简单的方法是将别名命名self.h.x为y:

class Open(object):
    def __init__(self):
        self.h = Hidden()
        self.y = self.h.x
Run Code Online (Sandbox Code Playgroud)

现在当你打电话时,o.y(...)你实际上只是在打电话Hidden.x:

o = Open()
o.y("Hello") # > Hello John Doe

o.y("Hello", "Mister X") # > Hello Mister X
Run Code Online (Sandbox Code Playgroud)