2010-05-14 23 views
12

Parametre olarak zaman aşımı değerini alan bir Python işlevi yazıyorum. Normalde, kullanıcı her zaman aynı zaman aşımı değerini kullanır, ancak zaman zaman biraz daha uzun süre beklemek isteyebilir. Zaman aşımı değeri bir sınıf örneği değişkeni olarak saklanır. 'Timeout instance değişkenini varsayılan parametre olarak kullanmak istiyorum.Python Örnek Varsayısı Varsayılan Parametre olarak

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

varsayılan bir parametre olarak bir örnek değişkeni kullanmak için uygun bir yoldur: Şu anda, ben bu hayata ben? Yoksa "if" kontrolünden kaçınmanın daha iyi bir yolu var mı?

cevap

12

Sorunuzun kısa cevabı hayır, Python yalnızca bir kez imzayı inceler çünkü eğer deyimi ortadan kaldırabilir ve böylece varsayılan olamaz varsayılan değer olarak None kullanmaktır tüm çağrılar arasında paylaşılır. örneğin, düşünün:

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

Karşı:

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

Bu iki fonksiyonları, bunlar aynı gözükmesine rağmen aslında tamamen farklı davranışa sahip; Birincisinde, varsayılan değer L değişkeleri arasında paylaşılır, böylece addit(1) ve ardından addit(2) geri dönecektir, ilk durumda, aslında aynı temel nesneyi işaret eden ve [1,2] değeri olan iki nesne. ikinci durumda, iki ayrı nesneyi, [1] ve [2] döndürecektir.

Sizin için sahip olduğum tek öneri, varsayılan olarak None varsayılanı kullanmaktır, çünkü bu, belirtilmemiş parametreler için standart bir kuraldır, ancak bir varsayılan onay olarak kullanıldığı için bir if kontrolünü kullanmaya devam etmek içindir Bazı mevcut nesneler, çok farklı (genellikle yanlış) davranışa sahip olacaktır. python'da

14

yaygın bir yolu

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

> 2.5 yapabilirsiniz ternary condition operator kullanarak güvenli bir satır:

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