2013-08-02 86 views
18

考慮:拉姆達*指定參數時,** kwargs:無

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') 

對於做這種方式是我沒有把邏輯檢查,如果回調已被分配,因爲它默認爲blank_fn的動機它什麼都不做。

這是有效的,但有什麼理由我不應該這樣做嗎?它是pythonic嗎?有沒有更好的方法來做到這一點?是否有一個內置的:

lambda *args, **kwargs: None 
+5

使用'lambda'定義命名函數不是Pythonic,no。使用'def'。 – geoffspear

回答

31

PEP8,你應該「始終使用,而不是直接結合lambda表達式到一個名稱賦值語句DEF語句。」所以,有一件事我會改變是:

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

不過,我覺得更Python的方式來做到這一點是:

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

不應該有任何需要調用什麼都不做的函數。真值測試比函數調用更便宜。

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

好的。我想,如果我確實有一個合法的默認回調,我可以將其解析並將其作爲默認傳遞。否則,我會用無聊的老...如果......沒有:。布萊什! – Scruffy

+0

感謝您的編輯! – Bahrom

+0

有時會發生perform_task做一些複雜的工作,並且你想盡可能多地考慮它。許多采取blank_fn方式的小步驟可以導致一個很好的,可管理的代碼。通常,保持代碼清潔而不是優化代碼更爲重要。 –