2013-08-02 20 views
18

rozważenia:lambda * args, ** kwargs: Brak

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

Motywacją dla robią to w ten sposób jest nie mam umieścić w logice, by sprawdzić, czy zwrotna został przypisany, ponieważ domyślnie blank_fn który po prostu nie robi nic.

To działa, ale czy jest jakiś powód, dla którego nie powinienem tego robić? Czy to pyton? Czy istnieje lepszy sposób na zrobienie tego? Czy jest wbudowany do: „Zawsze należy stosować oświadczenie def zamiast instrukcji przypisania, które wiąże wyrażenia lambda bezpośrednio do nazwy”

lambda *args, **kwargs: None 
+5

Użycie 'lambda' do zdefiniowania nazwanej funkcji nie jest pythoną, nie. Użyj 'def'. – geoffspear

Odpowiedz

31

Według PEP8, należy Więc jedna rzecz, którą chciałbym zmienić to:

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

Myślę jednak, że bardziej pythonic sposobem na to jest:

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

Nie powinno być żadnej potrzeby, aby wywołać funkcję, która nic nie robi . Testowanie wartości prawdy jest tańsze niż wywoływanie funkcji.

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. Przypuszczam, że gdybym miał domyślny oddzwanianie, mógłbym go usunąć i przekazać jako domyślny. W przeciwnym razie użyję nudnego starego, jeśli ... Żadne :. Blech! – Scruffy

+0

Dzięki za bardzo pomocną edycję! – Bahrom

+0

Czasami zdarza się, że perform_task wykonuje pewne skomplikowane zadanie i chcesz brać pod uwagę jak najwięcej. Wiele małych kroków, takich jak przyjmowanie sposobu blank_fn, może prowadzić do ładnego, łatwego w zarządzaniu kodu. I często ważniejsze jest utrzymanie kodu w czystości, a nie jego optymalizacja. –