我发现了什么:
在Dive in to Python 中,我读到了 and 运算符的特殊性质,and
以及or
布尔运算符的短路求值如何通过与C 中的三元运算符非常相似的and-or 技巧更简洁地表达条件。
C:
result = condition ? a : b
Python:
result = condition and a or b
这似乎派上了用场,因为 lambda 函数在 Python 中仅限于单行,但它使用逻辑语法来表达控制流。
从 Python 2.5 开始, inline-if
似乎已经成为一种更易读的 and-or 技巧的语法:
result = a if condition else b
所以我猜这是对可读性较差的和/或构造的pythonic替代品。即使我想嵌套多个条件,它看起来仍然很全面:
result = a if condition1 else b if condition2 else c
但是在一个充满不确定性的世界中,我经常发现自己编写了一些这样的代码来访问 abc :
result = a and hasattr(a, 'b') and hasattr(a.b, 'c') and a.b.c or None
因此,在inline-if的帮助下,我可能可以摆脱一些ands和ors,从而产生一段可读性很强的代码:
result = a.b.c if hasattr(a, 'b') and hasattr(a.b, 'c') else None
我还在这个食谱中发现了一种有点神秘的方法来处理条件
result = (a, b)[condition]
但这不会短路,如果条件结果不返回布尔值 0 或 1,则会导致各种错误。
我想知道的:
现在我想知道是否认为使用内联更可取/更pythonic -if
如果向下兼容性不是一个问题,或者只是一个品味问题,以及在短路世界中的感觉如何评估?
更新
我刚刚意识到 inline-if 不仅仅是 and-or-trick 的语法糖,因为a
在布尔上下文中为 false 时它不会失败。所以它可能更防故障。