2013-08-02 15 views
18

düşünün:lambda * args ** kwargs: Yok

blank_fn = lambda *args, **kwargs: None 

def callback(x, y, z=''): 
    print x, y, z 

def perform_task(callback=blank_fn): 
    print 'doing stuff' 
    callback('x', 'y', z='z') 

Ben geri arama atanmış eğer varsayılan blank_fn çünkü kontrol etmek mantık koymak gerekmez olduğunu bu şekilde yapmak için motivasyon sadece hiçbir şey yapmaz.

Bu işe yarıyor, ama yapmamam için bazı nedenler var mı? Pythonic mi? Bunu yapmanın daha iyi bir yolu var mı? yerleşik bir için var mı: "Her zaman bir ad yerine doğrudan lambda ifadesi bağlayan atama deyiminin bir def deyimi kullanın"

lambda *args, **kwargs: None 
+5

Adlandırılmış bir işlev tanımlamak için 'lambda'nın kullanılması Pythonic değil, no. 'Def' kullanın. – geoffspear

cevap

31

PEP8 göre, gerektiği Yani, değiştirecek tek şey ise;

def blank_fn(*args, **kwargs): 
    pass 

Ancak, bunu yapmak için daha pythonic yolu olduğunu düşünüyorum:

def perform_task(callback=None): 
    print 'doing stuff' 
    if callback is not None: 
     callback('x', 'y', z='z') 

hiçbir şey yapmaz bir işlevi çağırmak için gerek olmamalıdır . Gerçek değer testi işlev çağrısından daha ucuzdur.

def do_nothing(*args, **kwargs): pass 
def do_something(arg, callback=do_nothing): 
    a = 1 + 2 
    callback('z', z='z') 
def do_something_else(arg, callback=None): 
    a = 1 + 2 
    if callback is not None: 
     callback('z', z='z') 

%timeit do_something(3) 
1000000 loops, best of 3: 644 ns per loop 

%timeit do_something_else(3) 
1000000 loops, best of 3: 292 ns per loop 
+1

Tamam. Eğer yasal bir varsayılan geri çağırma sahip olsaydı ben bunu def ve varsayılan olarak geçirebilir varsayalım. Aksi takdirde sıkıcı eski kullanırım ... Yok :. Blech! – Scruffy

+0

Çok yararlı düzenleme için teşekkürler! – Bahrom

+0

Bazen perform_task'ın karmaşık bir iş yapması ve bunun mümkün olduğu kadar çok faktörünü hesaba katmak istersiniz. Blank_fn yolunu almak gibi pek çok küçük adım, güzel ve yönetilebilir bir koda yol açabilir. Ve genellikle kodu optimize etmek yerine temiz tutmak daha önemlidir. –

İlgili konular