Python中如何实现等同于foo或foo='bar'的表达式?

2 投票
3 回答
4154 浏览
提问于 2025-04-16 02:22

我想做一些类似这样的事情:

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

撰写回答