我想做点什么:
def get_foo():
return self._foo or self._foo = Bar()
我正在寻找最干净的方法。是等于或等于?
我的尝试失败了:
>>> foo = None
>>> foo or 'bar'
'bar'
>>> foo
>>> foo or foo = 'bar'
File "<stdin>", line 1
SyntaxError: can't assign to operator
>>> foo or (foo = 'bar')
File "<stdin>", line 1
foo or (foo = 'bar')
^
SyntaxError: invalid syntax
答案 0 :(得分:6)
在Python中,您不能在表达式中使用赋值。因此,您必须在两个不同的行上执行赋值和return
语句:
def get_foo(self):
self._foo = self._foo or Bar()
return self._foo
但总的来说,最好把它写出来:
def get_foo(self):
if not self._foo:
self._foo = Bar()
return self._foo
答案 1 :(得分:4)
Python的赋值运算符不会传递指定的值,主要是因为在其他语言中,它已被证明是一个有意义的=
/ ==
错误的有效生成器。相反,你必须明确:
def get_foo(self):
if self._foo is None:
self._foo= Bar()
return self._foo
如果您真的想要,可以使用副作用制作表达式:
def set_foo(self, v):
self._foo= v
return v
return self._foo or self.set_foo(Bar())
但它通常被认为是一件坏事。
答案 2 :(得分:-1)
我可能错了,但这似乎是||=
运营商的工作。
def get_foo():
return self._foo |= Bar()
我的Perl充其量生锈,但是|| =似乎返回一个R值,所以返回应该有效。
编辑:Woopsie,这是Python。它没有||=
。长号。
然后我会使用simulated ternary operator:
def get_foo()
self._foo = self._foo is None and Bar() or self._foo
return self._foo
编辑2:Python有一个真正的三元运算符。使用它而不是上面的。
def get_foo()
self._foo = Bar() if self._foo is None else self._foo
return self._foo