2013-08-02 15 views
18

considerare:lambda * args, ** kwargs: Nessuno

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

La motivazione di fare in questo modo è che non devo mettere in logica per verificare se richiamata è stato assegnato, perché il default è blank_fn che non fa nulla.

Questo funziona, ma c'è qualche motivo per cui non dovrei farlo? È pitone? C'è un modo migliore per farlo? C'è un built-in per:

lambda *args, **kwargs: None 
+5

L'uso di 'lambda' per definire una funzione con nome non è Pythonic, no. Usa 'def'. – geoffspear

risposta

31

Secondo PEP8, si dovrebbe "Usa sempre una dichiarazione def invece di un'istruzione di assegnazione che si lega un'espressione lambda direttamente a un nome." Quindi, una cosa che cambierei è:

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

Tuttavia, credo che un modo più divinatorio per farlo è:

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

non ci dovrebbe essere alcun bisogno di chiamare una funzione che non fa nulla . Il test del valore di verità è più economico della chiamata di funzione.

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

Ok. Suppongo che se avessi una legittima callback predefinita potrei def e passarla come predefinita. Altrimenti userò il noioso vecchio se ... Nessuno :. Blech! – Scruffy

+0

Grazie per la modifica molto utile! – Bahrom

+0

A volte capita che perform_task svolga un lavoro complicato e tu ne voglia calcolare il più possibile. Molti piccoli passi come prendere il modo blank_fn possono portare a un codice piacevole e gestibile. E spesso è più importante mantenere il codice pulito piuttosto che ottimizzarlo. –

Problemi correlati