你幾乎從來都沒有定義的變量,當你經常這樣做意味着你有m個發生錯誤。但是,方便起見,大多數通常用作默認值(空容器,零長度字符串,零和None
)的值在Python中是「虛假」的,所以您有時候會看到類似這樣的東西,它利用了Python中的布爾運算符的工作:
name = name or "Guido" # if name is empty, set it to "Guido"
numb = numb or 42 # if numb is zero, set it to 42
這部作品的原因是Python的停止評估or
如果第一個參數是「truthy,」這就是所謂短路,並在這兩種情況下返回實際的參數,而不是其結果僅爲True
或False
。因此,如果name
是「吉姆」,那麼"Jim" or "Guido"
的計算結果爲"Jim"
,因爲"Jim"
是非零長度的字符串,因此爲「truthy」。
當然,如果您不知道所處理的值的類型和/或「falsy」值是否爲有效值,那麼這種方法效果不佳。然而,它的工作原理相當不錯的東西像配置文件和raw_input()
其中一個缺失值會返回一個空字符串:在一個字典項時,
name = raw_input("What is your name? ") or "Guido"
另一種常見的成語使用。如果變量不在字典中,字典類的get()
方法可讓您指定要使用的默認值。
name = values.get("name", "Guido")
這可以當你的功能已經通過使用**kwargs
約定關鍵字參數一起使用。您可以也有變數使用它,作爲globals()
和locals()
功能範圍返回,分別,所有的全局或局部變量,目前作爲詞典:
name = locals().get("name", "Guido")
然而,正如我說的,你很少會擁有實際上是Python中未定義的變量。例如,在Web框架的情況下,您會將查詢字符串參數作爲字典傳遞,並且可以使用字典的.get()
方法。
在罕見的情況下,名稱實際上不存在(例如,您的配置文件是Python語法,並且您將它作爲Python模塊導入而不是解析它,並且希望用戶可以省略一些值...或者同樣古怪的),那麼你可以使用getattr()
,這(如字典的.get()
)接受默認值:
import config
name = getattr(config, "name", "Guido") # rather than just name.config
,還是讓它拋出一個NameError
並抓住它。
是的,它似乎是一個重複。感謝Adam! – 2012-01-30 05:23:34
'$ foo || =「如果它已經是* false *,將重新分配'$ foo'。當然'undef'是錯誤的,但是零和空字符串也是如此。要重新分配一個未定義的值,請使用斜槓,而不是'$ foo // =「what」 – Borodin 2012-01-30 05:28:35
請注意,在Perl 5.10中添加了「//」(及其擴展名,「// =」)。如果你仍然堅持5.8.x,你將無法使用''// ='(如果可能的話,你應該認真考慮升級)。 – 2012-01-30 14:40:49