簡體   English   中英

在 if 語句中賦值 Python

[英]Assign within if statement Python

有沒有比這更簡單的選擇

res = returns_value_or_none(arg)
if res:
    do_something_with(res)

要么

if returns_value_or_none(arg):
    do_something_with(returns_value_or_none(arg))

一種將賦值和if條件組合到一個語句中的語句?

通常,你所擁有的已經是最好的選擇。


您始終可以創建一個新范圍來將值綁定到變量:

(lambda res: do_something_with(res) if res else None)(returns_value_or_none(arg))

但這肯定不會更具可讀性,或者更像 Pythonic。


如果你只想保存一行,你可以這樣做:

res = returns_value_or_none(arg)
if res: do_something_with(res)

有時更具可讀性,但通常是凈損失。


解決這個問題的另一種方法是將do_something_with更改為接受None並且什么都不做。 這在 Python 中並不像在 Smalltalk 或 Swift 中那么常見,但有時它確實有它的位置。

很難理解為什么使用這樣的玩具示例,但是如果您調用這些函數 70 次,將檢查放在函數內部的一個地方,而不是 70 個地方,它被調用的任何地方,顯然是一個勝利。 (特別是因為您可能會將它放在 68 個位置而忘記了其他 2 個。)


最后但並非最不重要的一點是,在許多情況下,正確的答案是例外。 如果您通過None您的do_something_with可能已經提高了。 而且您肯定可以將returns_value_or_none更改為returns_value_or_raises

同樣,在這個玩具示例中,它看起來就像是更多的代碼。 但是在現實生活中的代碼中,將整個代碼塊放在try / except通常是有意義的,並在最后一次處理所有錯誤。 或者甚至讓異常滲透到更容易處理的更高級別。

當然,這並不適用於所有情況。 如果您期望None是一個頻繁且完全合理的響應,並且只想跳過一個步驟而不是中止整個操作鏈,那么檢查或傳遞None將比將您的代碼亂扔垃圾更有意義try塊。

對於 Python 3.8+, PEP 572引入了賦值表達式

這允許使用符號NAME := expr在表達式中分配變量。 它可以在 if 語句中使用,例如:

if (match := pattern.search(data)) is not None:
    # Do something with match

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM