将"x,如果x不是其他y"重构为"x或y"

Nra*_*ras 3 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)
Run Code Online (Sandbox Code Playgroud)

所以该类具有b固定属性foo,如果不带参数调用它,它将用作类方法的默认输入.

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

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

用法如下所示:

c = MyClass(2)
c.foo(3)  # returns 3*2 = 6
c.foo()  # returns 10*2 = 20
Run Code Online (Sandbox Code Playgroud)

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

以下两个建议中的一个或多或少是我想要的?如果是这样:为什么?

def foo(self, b=None):
    return bar(b or self.b)
Run Code Online (Sandbox Code Playgroud)

要么

def foo(self, b=self.b):
    return bar(b)
Run Code Online (Sandbox Code Playgroud)

khe*_*ood 7

坚持第一个选择:

def foo(self, b=None):
    return bar(b if b is not None else self.b)
Run Code Online (Sandbox Code Playgroud)

如果您使用第二个选项:

def foo(self, b=None):
    return bar(b or self.b)
Run Code Online (Sandbox Code Playgroud)

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

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

def foo(self, b=self.b):
    return bar(b)
Run Code Online (Sandbox Code Playgroud)

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

  • 同意,虽然我可能会消除'not`:`self.b如果b是None else b` (2认同)
  • @PM2Ring 我想说,这取决于通常会发生什么。在读取 `self.b if b is None else b` 时,我假设传递参数 `b` 会使用 `self.b` 覆盖默认行为。在读取 `b if b is not None else self.b` 时,我假设使用了参数 `b`,但如果缺少该参数,则有一个默认值 `self.b`。结果相同,但语义不同。 (2认同)