Is this idiom pythonic? (someBool and “True Result” or “False Result”)
我刚刚在一些开源Python中遇到过这个成语,我对我的饮料感到窒息。
而不是:
1 2 3 4 | if isUp: return"Up" else: return"Down" |
甚至:
1 | return"Up" if isUp else"Down" |
代码阅读:
1 | return isUp and"Up" or"Down" |
我可以看到这是相同的结果,但这是Python中的典型成语吗? 如果是这样,它是否会快速运行? 或者它只是一次性需要代码审查?
如果在Python中,在编写和实现PEP 308之前,"a和b或c"成语是表达三元算术的规范方式。这个成语失败,"b"答案本身就是假的;为了支持一般情况,你可以写
1 | return (a and [b] or [c])[0] |
另一种拼写方式是
1 | return (b,c)[not a] |
随着bool类型的引入,可以改写为
1 | return (c,b)[bool(a)] |
(如果不清楚:如果不知道bool已转换为bool和not运算符是必要的)
今天,如果事物必须是表达式,则应该使用条件表达式语法;否则我建议使用if语句。
您应该阅读Mark Pilgrim使用Dive Into Python的and-or trick(第4.6.1节)。事实证明,和 - 或技巧有你应该注意的主要陷阱。
这段代码对我的口味来说是一个很大的变化和聪明,但我认为它本身没有任何问题。我认为这只是一个"让一切都融入一线"综合症的案例。
我本人会选择第一种形式。
让人惊讶。根本不可读。对我来说,pythonic意味着易于阅读。
1 | return isUp and"Up" or"Down" |
听起来你会在perl做些什么。
不它不是。
前几天我有一个类似的问题。
如果构造
1 | val if cond else alt |
不是很受欢迎(至少是SO社区),首选的是:
1 2 3 4 | if cond: val else: alt |
你可以得出自己的结论。 :)