【问题标题】:or as a shortcut for if ... is not None else或作为 if ... is not None else 的快捷方式
【发布时间】:2021-12-16 15:31:42
【问题描述】:

我经常会有这样的任务:

data = {
    'a': var_a if var_a is not None else default_a,
    ...
}

这有点冗长。我认为这可以缩短为

data = {
    'a': var_a or default_a,
    ...
}

至少如果我知道 var_a 不会采用像 0 或 [] 这样的值。

使用这种较短的符号有什么缺点吗?

【问题讨论】:

  • 如果var_aFalse,我猜会分配None 吗?也许它会和 0 一样?
  • @xdurch0 $ python3 -c "p​​rint(None or 'abc')" -- 输出:abc
  • 曾几何时,您不得不var_a or default_a,然后找出导致它失败的异常并解决它们。 ... if ... else ... 被添加到语言中以解决该问题。你走错了方向:)
  • 如果PEP-505 获得批准,您就可以写var_a ?? default_a。 (不过,请不要屏住呼吸。)请参阅discuss.python.org/t/pep-505-status/4612/10,了解为什么该提案被推迟而不是被拒绝。

标签: python


【解决方案1】:

如果 var_afalsy 则不好。这包括布尔值 False、任何数字类型的零和其他一些。例如,[] or 'foo' 打印 'foo'。我喜欢这个主意,也许还有其他 Pythonian 方式可以让它发挥作用。

【讨论】:

    【解决方案2】:

    var_a or default_a 是当 None 被视为与任何“Falsy”值(0、[]、False、...)相同时的常用方法。

    如果你特别需要检查None,你可以这样表达:

    'a': (var_a,default_a)[var_a is None]
    

    或者至少通过颠倒顺序避免not

    'a': default_a if var_a is None else var_a 
    

    如果你要经常这样做,你可以创建一个函数来缩短表达式:

    def noNone(v,d): d if v is None else v
    

    ...

    'a': noNone(var_a,default_a)
    

    【讨论】:

    • 具体问题是有很多不是 None 的虚假值,这是var_a or default_a 中断的地方(或至少不等效)。您建议的解决方法只是增加了调用函数的开销,而不会大大提高可读性。
    猜你喜欢
    • 2011-02-12
    • 2020-12-01
    • 1970-01-01
    • 2016-05-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多