如果python方法调用参数为None,则使用default参数

时间:2017-01-19 15:00:53

标签: 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

如果bNone(未设置),我希望在没有参数的情况下调用方法x(使用默认值)。

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

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

这是我对给定答案的总结:

  1. @Duncan:对我而言,这是实现我想要的最好方式。
  2. @falsetru:这也是一个很好的方法,虽然我认为*args的方法很难阅读。
  3. @ peter-wood和@tgg:两个版本都可以工作并保存3行代码。但是if声明仍然存在,我想避免这种说法。

5 个答案:

答案 0 :(得分:4)

如何使用变长参数(*args):

def y(*args):
    x(*args)

然后,没有定义y的意思!

y = x

<强>更新

根据问题更新调整y方法。但这一点仍然有效;使用*args获取任意长度参数:

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

    def y(self, *args):
        self.h.x(*args)

    # Alternative: explicitly pass `a` for readability
    #
    # def y(self, a, *args):
    #     self.h.x(a, *args)

答案 1 :(得分:1)

如果您可以修改x

def x(a, b=None):
    b = "John Doe" if b is None else b 
    print a, b

答案 2 :(得分:1)

根据您对课程的更新问题,简单方法就是将self.h.x别名为y

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

现在,当您致电o.y(...)时,您实际上只是致电Hidden.x

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

o.y("Hello", "Mister X") # > Hello Mister X

答案 3 :(得分:1)

如果您想摆脱'if',那就去做

float

ps。这适用于python3.5 +,我不在乎python2.7

答案 4 :(得分:0)

实际上,你的函数x完全符合预期。

def x(a, b="John Doe"):
   print a, b

然后:

>>> x('Hello')
Hello John Doe
>>> x('Hello','Mister X')
Hello Mister X

但如果你真的想,你可以这样做:

def x(a, b="John Doe"):
   if b == None: b = "John Doe"
   print a, b