重构" x如果x不是其他没有y"到" x或y"

时间:2016-01-25 12:50:59

标签: python refactoring default-value

我遇到了一段Python代码,技术上看起来像这样:

def bar(b):
    return b*2

class MyClass(object):
    def __init__(self, a):
        self.a = a
        self.b = 10

    def foo(self, b=None):
        return bar(b if b is not None else self.b)

因此,类具有b作为固定属性,如果在没有参数的情况下调用它,则将其用作类方法foo的默认输入。

请假设在这种情况下b预计是浮动的。

请忽略未使用的self.a,否则使用它 - 我只是想确保您看到构造函数可以设置属性。

用法如下:

c = MyClass(2)
c.foo(3)  # returns 3*2 = 6
c.foo()  # returns 10*2 = 20

在这种情况下,我想知道foo - 方法。这是将self.b作为b的默认值实现的好方法吗?

以下两个建议中的一个或多或少是我的愿望吗?如果是这样的话:为什么?

def foo(self, b=None):
    return bar(b or self.b)

def foo(self, b=self.b):
    return bar(b)

1 个答案:

答案 0 :(得分:7)

坚持第一个选择:

def foo(self, b=None):
    return bar(b if b is not None else self.b)

如果您使用第二个选项:

def foo(self, b=None):
    return bar(b or self.b)

然后你将改变x.foo(0)的行为,因为零也是假的。

第三种选择不是一种选择:

def foo(self, b=self.b):
    return bar(b)
定义方法self时,

foo()不存在,因此您不能将self.b用作默认参数。定义将失败;或者更糟糕的是,它会在执行定义时尝试使用self的当前值。