将 "x if x is not None else y" 重构为 "x or y"
Refactoring "x if x is not None else y" to "x or y"
我发现了一段 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)
因此 class 具有 b
作为固定属性,如果不带参数调用它,它将用作 class 方法 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)
坚持第一个选项:
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
的当前值。
我发现了一段 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)
因此 class 具有 b
作为固定属性,如果不带参数调用它,它将用作 class 方法 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)
坚持第一个选项:
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
的当前值。