【问题标题】:Assignment with "or" in python [closed]在python中用“或”赋值[关闭]
【发布时间】:2012-02-03 14:04:42
【问题描述】:

这样给变量赋值会被认为是不好的风格吗?

x = "foobar" or None
y = some_variable or None

在上面的示例中,x 获取值 'foobar'。

【问题讨论】:

标签: python coding-style variable-assignment


【解决方案1】:

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

【讨论】:

  • 它在 JavaScript 中被认为是一种反模式。它不会自然地被外行阅读,并且您不能分配虚假值。
  • @diginoise Javascript 或任何其他语言中的任何内容都不会自然地让外行人阅读。但是一旦开发人员熟悉了捷径评估(例如,if foo or bar... 中使用的,这是 JS、Python 和许多其他语言中相当常见的习语),它就会很自然地阅读,尽管您可能需要考虑你第一次看到它的时候。然而,“假”值在 Python 中也是一个问题,就像 'list = [];返回列表或False`
【解决方案2】:

这样做的主要危险是(在第二种情况下)some_variable 为 False 但不是 None(例如整数 0)并且您不想以 @ 结尾在这种情况下,987654323@ 等于 None。

【讨论】:

    【解决方案3】:

    我也觉得用那种表达方式有点不舒服。在 Learning Python 4ed 中,它被称为“有点不寻常的行为”。 后来 Mark Lutz 说:

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

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

    A = Y if X else Z
    

    【讨论】:

    • 但它可能会导致重复很长的参数,其中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 or None
    • @RoeeGavirel 只需将 my_value 分配给局部变量
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2016-05-17
      • 2020-12-23
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 2014-04-12
      • 2019-07-31
      相关资源
      最近更新 更多