2010-05-14 54 views
12

我正在編寫一個Python函數,它將超時值作爲參數。通常情況下,用戶將總是使用相同的超時值,但有時他可能想稍微等待一段時間。超時值作爲類實例變量存儲。我想使用類的超時實例變量作爲默認參數。目前,我正在實施如下:Python實例變量作爲默認參數

def _writeAndWait (self, string, timeout = -1): 
    if (timeout == -1): 
     timeout = self._timeout 

我只是想知道,是使用實例變量作爲默認參數的正確方法?還是有更好的方法可以避免「if」檢查?

回答

12

簡短的回答你的問題是,不,你不能消除的if語句,因爲Python檢查簽名只有一次,所以默認在所有通話中共享。舉個例子:

def addit(x, L=[]): 
    L.append(x) 
    return L 

對戰:

def addit(x,L=None): 
    if L is None: 
     L=[] 
    L.append(x) 
    return L 

這兩個功能,雖然它們看起來一樣,其實有完全不同的行爲;在第一種情況下,L的默認值在調用之間共享,因此addit(1)後跟addit(2)將在第一種情況下返回實際指向相同底層對象且值爲[1,2]的兩個對象,而它第二種情況下,它將返回兩個單獨的對象,[1][2]

因此,我唯一的建議是使用缺省值None,因爲這是沒有指定的參數的標準約定,但是繼續使用if檢查,因爲使用默認值一些現有的對象會有微妙的不同(通常是錯誤的)行爲。

14

的常用方法是使用None作爲默認值

def _writeAndWait (self, string, timeout=None): 
    if timeout is None: 
     timeout = self._timeout 
1

在蟒蛇> 2.5,你可以安全的一條線通過ternary condition operator

def _writeAndWait (self, string, timeout=None): 
    timeout = self._timeout if timeout is None else timeout