如何在Python lambdas中表达条件执行?
作者:互联网
我发现了什么:
在Dive in Python中,我读到了and和or运算符的特殊性质
以及如何使用布尔运算符的短路评估来通过and-or trick更简洁地表达条件,其非常类似于C中的三元运算符.
C:
result = condition ? a : b
Python:
result = condition and a or b
这似乎派上用场,因为lambda函数仅限于Python中的单行,但它使用逻辑语法来表达控制流.
从Python 2.5开始,inline-if似乎已经成为了一个更具可读性和/或技巧的语法:
result = a if condition else b
所以我猜这是pythonic替代不太可读和构造的东西.
即使我想嵌套多个条件,它仍然看起来相当全面:
result = a if condition1 else b if condition2 else c
但在一个不确定的世界里,我经常发现自己编写了一些这样的代码来访问a.b.c:
result = a and hasattr(a, 'b') and hasattr(a.b, 'c') and a.b.c or None
所以在内联的帮助下 – 如果我可以摆脱一些ands和ors,导致一段相当可读的代码:
result = a.b.c if hasattr(a, 'b') and hasattr(a.b, 'c') else None
在这个recipe中,我还发现了一种对于conditonals有些神秘的方法
result = (a, b)[condition]
但这不会短路,如果条件的结果没有返回布尔值0或1,则会导致各种错误.
我想知道的是什么:
现在我想知道使用内联是否更好/更pythonic – 如果向下兼容性不是一个问题,或者只是一个品味的问题,以及在短的世界中有多少感觉电路评估?
更新
我刚刚意识到inline-if不仅仅是针对and-or-trick的语法糖,因为当a在布尔上下文中为false时它不会失败.所以它可能更加防止故障.
解决方法:
pythonic要做的就是识别当你将代码拉伸到合理的单一函数并只使用普通函数时.请记住,对于lambda,你无法用命名函数完成任何事情.
当然,每个人的突破点都不同,但如果你发现自己在写作:
return a.b.c if hasattr(a, 'b') and hasattr(a.b, 'c') else None
太多了,考虑一下这样做:
try:
return a.b.c
except AttributeError:
return None
标签:python,lambda,conditional,short-circuiting,inline-if 来源: https://codeday.me/bug/20190626/1297047.html