[英]How to express conditional execution inside Python lambdas?
在Dive in Python中,我讀到了and
和or
運算符的特殊性質以及如何使用布爾運算符的短路評估來更簡潔地表達條件,這些和/或技巧非常類似於C中的三元運算符。
C:
result = condition ? a : b
蟒蛇:
result = condition and a or b
這似乎派上用場,因為lambda函數僅限於Python中的單行,但它使用邏輯語法來表達控制流。
因為Python 2.5 inline- if
似乎已經前來救援作為一個更可讀的語法和-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
所以在內 聯的幫助下- 如果我可以擺脫一些ands和ors ,導致一段相當可讀的代碼:
result = a.b.c if hasattr(a, 'b') and hasattr(a.b, 'c') else None
在這個配方中,我還發現了一種對於conditonals有些神秘的方法
result = (a, b)[condition]
但這不會短路,如果條件的結果沒有返回布爾值0或1,則會導致各種錯誤。
現在我想知道使用內聯是否更好/更pythonic - if
盡可能地向下兼容性不是一個問題,或者只是一個品味的問題以及在短期世界中有多少感覺電路評估?
我剛剛意識到inline-if不僅僅是針對and-or-trick的語法糖,因為當a
在布爾上下文中為false時它不會失敗。 所以它可能更加防止故障。
因為有一個特殊的語言構造,帶有內聯if
- else
可以做你想要的,而且是為了替換你提到的丑陋的變通方法,所以使用它是個好主意。 特別是因為像and
- or
技巧的黑客通常有意想不到的角落案例/錯誤。
例如, and
- or
技巧在這種情況下失敗:
a = 0
b = 1
c = True and a or b
c
將1
,這是不是你所期望的,如果你正在尋找if
- else
語義。
那么,當有一種語言結構完全符合您的要求時,為什么要使用錯誤的解決方法呢?
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
我寧願明確我的代碼在做什么。 內聯if非常明確地進行條件賦值和可讀性確實很重要。 如果和/或副作用被認為是優選的話,內聯是否會使其成為語言。
條件表達式的pep詳細介紹了為什么選擇了特定語法,並且它具體討論了和/或hack:
這是針對您提到的特殊情況,但我認為大多數情況下您需要鏈接的短路邏輯可以使用更優雅的解決方案來處理。 這顯然是一個品味的問題,讓我補充一下,如果你認為上面的內容比這更好的話,請抓一點:
try:
foo = a.b.c
except AttributeError:
print "woops"
在其他不太直接的情況下,將所有測試封裝在函數中可能會大大提高可讀性。
編輯:順便說一句, 鴨子打字 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.