2012-02-22 124 views
30

這是非常基本的,但我編碼,並開始想知道是否有pythonic方法來檢查是否不存在。下面是我如何做到這一點,如果它的真實:pythonic檢查方式是否存在?

var = 1 
if var: 
    print 'it exists' 

但是當我檢查,如果事情不存在,我經常做這樣的事情:

var = 2 
if var: 
    print 'it exists' 
else: 
    print 'nope it does not' 

似乎是一個浪費,如果我所關心的是有沒有辦法檢查是否沒有其他的東西不存在?

+0

總有三元:http://stackoverflow.com/questions/394809/python-ternary-operator :) ...認爲它可能不是寫出來的最Pythonic的方式。 – summea 2012-02-22 06:32:25

+3

如果'var'實際上不存在**,那麼當您嘗試使用它時將會引發異常。這是'if' /'else'可以處理的。 '如果var' **假定**存在'var',** **如果它是「true-ish」(如果轉換爲布爾值,則變爲True而不是False)。 – 2012-02-22 08:56:58

+1

您並未檢查變量的存在,而是檢查它的值是否爲'True'作爲布爾上下文。 – FallenAngel 2013-07-19 10:02:43

回答

83

LBYL風格, 「三思而後行」:

var_exists = 'var' in locals() or 'var' in globals() 

EAFP風格, 「更容易請求原諒比許可」:編碼時

try: 
    var 
except NameError: 
    var_exists = False 
else: 
    var_exists = True 

傾向於第二種風格(EAFP) Python,因爲它通常更可靠。

+0

測試var是否不存在:'var'not in locals()和'var'not in globals() – MyopicVisage 2017-04-26 17:48:15

16

我認爲你必須要小心你的術語,什麼是否存在和一些計算結果爲是兩回事。假設你要後者,你可以簡單地做:

if not var: 
    print 'var is False' 

對於前者,這將是那麼優雅:

try: 
    var 
except NameError: 
    print 'var not defined' 

我要採取的飛躍和風險,但是,無論正在讓你想要檢查一個變量是否被定義,可能可以用更優雅的方式解決。

+0

抱歉,並不意味着錯誤。意味着如果它不存在。我經常在sql查詢中使用它(我在選擇查詢中包裝if語句,如果沒有結果返回,我會做一些工作),所以不要錯誤地尋找不存在的東西。 – Lostsoul 2012-02-22 06:37:00

+0

well'config = config()'然後'如果沒有配置:'給我「局部變量配置參考前分配」:) – holms 2013-02-27 10:32:01

0

否定的情況如何?

if not var: 
    print 'nope it does not' 

雖然這是爲了查看var是否爲false/none,並且如果var未定義,會爆炸。

要查看是否變種被定義:

try: 
    var 
except NameError: 
    print 'not defined' 
0
if not var: 
    #Var is None/False/0/ 

if var: 
    #Var is other then 'None/False/0' 

在Python如果varibale由具有不同於無/假/ 0然後If var條件將失敗...

和用於其它任何值它將調用__nonzero__ pythonic方法,根據其功能可能會返回TrueFalse

+2

這不會處理變量從未定義,這是OP的問題的情況。 – btown 2013-11-10 21:36:23

2

要檢查變種被定義爲:

var = 2 

try: 
    varz 
except NameError: 
    print("No varz") 

要檢查它是否是無/假

if varz is None 

...或

if not varz 
2

如果這是一個字典,你可以有

mydict['ggg'] = '' // doesn't matter if it is empty value or not. 
if mydict.has_key('ggg'): 
    print "OH GEESH" 

然而,has_key()完全從Python的3.x中刪除,因此,Python的方法是使用in

'ggg' in mydict  # this is it! 
# True if it exists 
# False if it doesn't 

可以使用in的元組,列表和設置也是如此。


當然,如果變量尚未定義,你將不得不默默引發異常(只是引發任何異常......讓它通過),如果異常是不是你想看到什麼(這對於許多應用程序,你只需要登錄除外)。


它始終是安全的,你使用它之前定義的變量(你會遇到的「轉讓之前的本地參考」,這意味着「變種不在「簡單英語」範圍內)。如果你使用查詢來做某件事,那麼機會就是,你會想要一本字典,並檢查一個密鑰是否存在,使用in

+0

最簡單的所有解決方案 – DrStrangepork 2016-03-01 19:54:22