如何在 Python lambda 中表达条件执行?

cod*_*aft 5 python lambda short-circuiting inline-if conditional-statements

我发现了什么:

《Dive in to Python》中,我了解了andand运算符的特殊性质,以及如何通过and-oror技巧使用布尔运算符的短路求值来更简洁地表达条件,该技巧与 C 中的三元运算符非常相似。

C:

result = condition ? a : b
Run Code Online (Sandbox Code Playgroud)

Python:

result = condition and a or b
Run Code Online (Sandbox Code Playgroud)

这似乎很方便,因为 lambda 函数在 Python 中仅限于单行函数,但它使用逻辑语法来表达控制流。

自 Python 2.5 以来,inline-if似乎已经作为一种更易读的语法来拯救 and-or 技巧:

result = a if condition else b
Run Code Online (Sandbox Code Playgroud)

所以我猜想这是可读性较差的 and-or-construct 的 pythonic 替代品。即使我想嵌套多个条件,它看起来仍然相当全面:

result = a if condition1 else b if condition2 else c
Run Code Online (Sandbox Code Playgroud)

但在一个充满不确定性的世界中,我经常发现自己编写一些类似这样的代码来访问 abc :

result = a and hasattr(a, 'b') and hasattr(a.b, 'c') and a.b.c or None 
Run Code Online (Sandbox Code Playgroud)

因此,在inline-if的帮助下,我可能可以去掉一些andsors,从而得到一段非常可读的代码:

result = a.b.c if hasattr(a, 'b') and hasattr(a.b, 'c') else None
Run Code Online (Sandbox Code Playgroud)

我还在这个食谱中发现了一种有点神秘的条件方法

result = (a, b)[condition] 
Run Code Online (Sandbox Code Playgroud)

但这不会短路,如果条件的结果不返回布尔值(0 或 1),则会导致各种错误。

我想知道的是:

if现在我想知道如果不考虑向下兼容性,那么尽可能多地使用内联是否被认为是更可取/更Pythonic ,或者这只是一个品味问题以及人们在短路世界中感觉如何自在评估?

更新

我刚刚意识到 inline-if 不仅仅是 and-or 技巧的语法糖,因为a在布尔上下文中当 is false 时它不会失败。所以它可能更防失败。

Dun*_*can 2

Python 要做的事情是认识到您的代码何时超出了塞入单个函数并仅使用普通函数的合理范围。请记住,使用 a 可以做的事情lambda也可以使用命名函数完成。

当然,每个人的转折点都会有所不同,但如果你发现自己在写:

return a.b.c if hasattr(a, 'b') and hasattr(a.b, 'c') else None
Run Code Online (Sandbox Code Playgroud)

太多了,考虑这样做:

try:
     return a.b.c
except AttributeError:
     return None
Run Code Online (Sandbox Code Playgroud)