Python中如何实现等同于foo或foo='bar'的表达式?
我想做一些类似这样的事情:
def get_foo():
return self._foo or self._foo = Bar()
我在寻找最简单的方法来实现它。用或等于(or equals)可以做到吗?
我之前的尝试都失败了:
>>> 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
3 个回答
-2
我可能说错了,但这看起来像是要用到 ||=
这个操作符。
def get_foo():
return self._foo |= Bar()
我的Perl水平一般,但我记得 ||= 似乎会返回一个R值,所以返回值应该是可以用的。
编辑:哎呀,这是Python。Python没有 ||=
。真可惜。
那我会用模拟三元操作符:
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
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())
但通常来说,这种做法被认为是不好的。
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