4

我正在以下形式简化python中的一些空/假检查:

这个:

if not a:
    a = 'foo'

可以简化为:

a = a or 'foo'

而且,看上面是自然地尝试进一步简化,如下所示:

a |= 'foo'

但是,python的就地or实际上是就地按位或:

a = None
a |= 'foo'
=> TypeError: unsupported operand type(s) for |=: 'NoneType' and 'str'

a = 'foo'
a |= 'bar'
=> TypeError: unsupported operand type(s) for |=: 'str' and 'str'

a = 1
a |= 2
print a
=> 3

a = 2
a |= 3
print a
=> 3

所以,问题是:Python 是否有一个 inplace 或?此外,您是否看到像这样进行简化的 null/false 检查时遇到问题?

免责声明

我知道这a is not Nonenot a. 前者评估 a 是否确实不是一个None值,而后者评估 a 是否不是评估为False(如False, None, 0, ''(空字符串),[], {}(空集合)等)

4

3 回答 3

3

Python 没有就地逻辑or,只有您已经在使用的按位版本。

于 2013-11-19T16:28:57.427 回答
3

我不相信有一个就地或。

至于a = a or 'foo',我见过,也经常用。据我所知,这是一个常见的成语。它是明确的并且行为非常明显,所以我不知道它违反了任何 PEP 准则。实际上,我发现它比它更易读,a |= 'foo因为它不求助于稀有的运算符并且可以自然地阅读。

于 2013-11-19T16:29:39.167 回答
2

你不能做你想做的,因为没有就地逻辑or,但我不认为你真的想做。在 Python 中,“可读性很重要”,a or= b或者任何绝对难以阅读的东西。a = a or 5是一个很常见的成语,所以不是太难读,但or=我认为肯定会。出于这个原因,我认为值得这样做if a is not None。在回答您关于 的可能危险的问题时a = a or default,我能想到的唯一一个是如果default有一个布尔值,False那么它会中断。

于 2013-11-19T16:30:45.190 回答