【问题标题】:Is this idiom pythonic? (someBool and "True Result" or "False Result")这是成语pythonic吗? (someBool 和“True Result”或“False Result”)
【发布时间】:2010-09-25 15:15:07
【问题描述】:

我刚刚在一些开源 Python 中遇到了这个成语,我被我的饮料呛到了。

而不是:

if isUp:
    return "Up"
else:
    return "Down"

甚至:

return "Up" if isUp else "Down"

读取的代码:

return isUp and "Up" or "Down"

我可以看到这是相同的结果,但这是 Python 中的典型习语吗?如果是这样,是不是一些运行速度很快的性能黑客?还是只是一次需要代码审查?

【问题讨论】:

    标签: coding-style python


    【解决方案1】:

    您应该阅读 Mark Pilgrim 的 Dive Into Python 中的 Using the and-or trick(第 4.6.1 节)。事实证明,and-or 技巧存在您应该注意的主要缺陷。

    【讨论】:

      【解决方案2】:

      不,不是。

      前几天我有一个similar question

      如果构造

      val if cond else alt
      

      不是很受欢迎(至少在 SO 社区中),首选的是:

      if cond:
          val
      else:
          alt
      

      您可以得出自己的结论。 :)

      【讨论】:

        【解决方案3】:

        哎呀。根本不可读。对我来说,pythonic 意味着易于阅读。

        return isUp and "Up" or "Down"
        

        听起来你会在 perl 中做一些事情。

        【讨论】:

          【解决方案4】:

          在编写和实现PEP 308 之前,“a 和 b 或 c”习语是在 Python 中表达三元算术的规范方式。这个成语失败了“b”答案本身就是错误的;为了支持一般情况,您可以编写

           return (a and [b] or [c])[0]
          

          另一种拼写方式是

           return (b,c)[not a]
          

          引入 bool 类型后,可以改写为

           return (c,b)[bool(a)]
          

          (如果不清楚:如果不知道 a 已经是 bool,则必须转换为 bool 和 not 运算符)

          今天,如果事物必须是表达式,则应该使用条件表达式语法;否则我建议使用 if 语句。

          【讨论】:

          • 替代语法与 and/or 方法或三元运算符确实有一个区别 - 两个值总是被评估。如果它们只是变量,那没什么大不了的,但是如果其中有函数调用(尤其是有副作用),那就会有所作为。
          【解决方案5】:

          按照我的口味,该代码非常笨拙和聪明,但我想它本身并没有什么问题。我认为这实际上只是“一条龙”综合症的一个案例。

          我个人会选择第一种形式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-05-16
            • 1970-01-01
            • 2014-07-13
            • 1970-01-01
            • 1970-01-01
            • 2013-04-25
            • 1970-01-01
            相关资源
            最近更新 更多