使用原位OR简化空值检查

4
我将简化Python中一些null/false检查,格式如下:
这个:
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或?此外,您是否认为像这样进行简化的空/假检查会出现问题?
免责声明
我知道a is not Nonenot a不同。前者评估a是否确实不是一个None值,而后者评估a是否不是可以评估为False(如FalseNone0''(空字符串)、[]{}(空集合)等)的东西。

2
“Python的in-place或实际上是在原地执行二进制加法” -> 不,它不是在原地执行二进制加法,而是在原地执行按位OR。 - kindall
name |= val 相当于 name = name | val(或多或少)。| 不是布尔 or 运算符,而是位或运算符。 - Martijn Pieters
实际上,我写的是二进制加法,但是我想到的是“按位电路加法”或者简单地说“按位或”。无论如何,我已经对我的问题进行了编辑,谢谢。 - Bruno Penteado
3个回答

3

Python没有原地逻辑或or,只有你已经使用的按位版本。


3
我不认为有in-place或者。
至于a = a or 'foo',我经常看到并使用它。据我所知,这是一个常见的惯用语。它是明确的,行为也很明显,所以我不知道它是否违反了任何PEP准则。事实上,我觉得它比a |= 'foo'更易读,因为它不需要罕见的运算符,自然而然地阅读起来。

如果可以的话,我会选择您和sweeneyrod的答案作为接受的答案。它们非常相似,但是由于他的答案更完整,所以我接受了他的答案。 - Bruno Penteado
@BrunoPolaco 没问题。很高兴能帮到你。 - KobeJohn

2

由于没有原地逻辑或,所以您无法做您想要的事情,但我认为您真正想要的也不是这样。在Python中,“可读性很重要”,而a or= b或任何其他东西绝对很难阅读。a = a or 5是一个相当常见的习惯用法,因此并不太难读,但我认为or=肯定会很难读。出于这个原因,我认为值得使用if a is not None来代替。至于您关于a = a or default可能存在的危险的问题,我能想到的唯一一个就是如果default具有布尔值False,那么它就会失效。


的确,我同意您关于可读性的看法。即使可以使用|=,由于相同的原因,我可能仍会放弃它。不管怎样,好奇心驱使着我。 - Bruno Penteado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接