2011-07-05 53 views
25

我最近不得不對一些可能未被初始化的變量(和它們的默認值是None)進行一次小的檢查。我想出了這個:檢查是否有一個變量設置爲無

if None in (var1, var2, var3): 
    error_out() 

雖然,在我眼裏,毗鄰美麗的,我想知道 - 這是一個好辦法做到這一點?這是方式嗎?有沒有這種情況會產生一些意想不到的結果?

+2

看起來不錯。 –

+2

我認爲這很完美。 – Tadeck

+1

對於未初始化的應用來說,這是完全正確的,因爲我們不關心像'var1 =(None,)'這樣愚蠢的角落案例。 – smci

回答

10

首先第一件事情:你的代碼是有效的,可讀性強,簡潔...所以它可能不是辦法做到這一點(成語隨着時間的推移和新的語言功能的發展),但它肯定是的一個以pythonic的方式來做到這一點。

其次,只有兩個意見:

產生在Python錯誤的標準方法是raise Exceptions。當然,你可以在一個函數中包裝你的異常提升,但是由於這很奇怪,我只是想知道你是否因爲某些特定原因選擇了這個設計。由於您可以編寫自己的Exception類,所以即使是樣板代碼(例如,將錯誤消息記錄到文件中)也可以在類本身內而不是在包裝函數中。

您編寫測試的方式是這樣的:您將無法將None作爲值分配給您的變量。現在這可能不是問題,但可能會限制您未來的靈活性。檢查初始化的另一種方式可以是簡單地申報有問題的變量的初始值,然後做線沿線的東西:

try: 
    self.variable_name 
except NameError: 
    # here the code that runs if the variable hasn't been initialised 
finally: 
    # [optional] here the code that should run in either case 
+0

實際上,正確的,最終的實現會引發一個'Exception',非常感謝您的深刻解答和觀察。 – maligree

7

一個稍稍不同的方式做這將是使用the built-in all method;然而,這也將趕上像0""假十歲上下的值,可能不是你想要的東西:

>>> all([1, 2, 3]) 
True 
>>> all([None, 1, 2]) 
False 
>>> all([0, 1]) 
False 
+1

這些不會做OP所要求的。「」和0被初始化,沒有不是。 – smci

+0

可能不是OP要求的內容,但實際上它適合某些使用情況,比接受的答案更恰當! – Angad

3

允許我在這裏留下我的兩分錢:

>>> any(a is None for a in [1,0]) 
False 
>>> any(a is None for a in [1,0, None]) 
True 

因此可以:

def checkNone(*args): 
    if any(arg is None for arg in args): 
     error_out() 

這裏沒有新東西。只是恕我直言,也許部分any arg is None更具可讀性