代码之家  ›  专栏  ›  技术社区  ›  Janusz Skonieczny

python等价于或等于表达式是什么,以使返回foo或foo='bar'工作?

  •  2
  • Janusz Skonieczny  · 技术社区  · 14 年前

    我想做如下的事情:

    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 回复  |  直到 14 年前
        1
  •  6
  •   Ivo    14 年前

    在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
    
        2
  •  4
  •   bobince    14 年前

    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())
    

    但这通常被认为是一件坏事。

        3
  •  -1
  •   kikito    14 年前

    我可能错了,但这看起来像是 ||= 操作员。

    def get_foo():
      return self._foo |= Bar()
    

    我的Perl充其量是生锈的,但是=似乎返回了一个r值,所以返回应该有效。

    编辑:Woopsie,这是巨蟒。它没有 = . 真倒霉。

    那我就用 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