在python中使用"或"进行赋值

The*_*One 32 python coding-style variable-assignment

将值赋给像这样的变量是否被认为是不好的风格?

x = "foobar" or None
y = some_variable or None
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,x得到值'foobar'.

tba*_*ack 23

不,这是一种常见的做法.对于比你长得多的表达式,它只被认为是不好的风格.

  • @diginoise用Java脚本或任何其他语言编写的内容都不会自然地被未充分理解的人读懂。但是一旦开发人员熟悉捷径评估(例如,在“ if foo或bar ...”中使用,这在JS,Python和许多其他语言中是很常见的习惯用法),那么它的读取自然就一样您可能会在第一次看到它时就考虑一下。但是,“ falsy”值在Python中也是一个问题,例如'list = []; 返回列表或False (3认同)
  • 它被认为是 JavaScript 中的反模式。对于外行来说,它不会自然地读取,并且您不能分配虚假值。 (2认同)

Fre*_*lio 15

做这样的事情的主要危险是(在第二种情况下)可能some_variable是False而不是None(0例如整数),并且y在这种情况下你不希望最终等于None.


Don*_*one 9

OP的语法非常好。
“or 赋值”的正式名称是空合并,现在实际上有一个关于它的维基百科页面!https://en.wikipedia.org/wiki/Null_coalescing_operator
这个问题也可能有用: Is there a Python equals of the C# null-coalescing operator?


joa*_*uin 5

我也觉得用那种表情有点不舒服。在 Learning Python 4ed 中,它被称为“有点不寻常的行为”。后来马克·卢茨说:

...事实证明这是 Python 中相当常见的编码范式:从固定大小的集合中选择一个非空对象,只需将它们串在一个 or 表达式中即可。在更简单的形式中,这也通常用于指定默认...

事实上,它们生成简洁的单行表达式,有助于消除代码中的行噪声。
这种行为是 if/else 三元运算符形式的基础:

A = Y if X else Z
Run Code Online (Sandbox Code Playgroud)

  • 但它可能会导致重复很长的参数,其中`Y = X`。例如:`A = my_main_dictionary.my_sub_dictionary.my_value if my_main_dictionary.my_sub_dictionary.my_value else None` 或 `A = my_main_dictionary.my_sub_dictionary.my_value 或 None` (4认同)
  • @RoeeGavirel 只需将 `my_value` 分配给局部变量 (2认同)