什么是Python相当于或等于表达式,以获得返回foo或foo ='bar'的工作原理?

时间:2010-08-05 10:11:56

标签: python

我想做点什么:

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

3 个答案:

答案 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