2013-08-02 6 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입니까? 그것을 할 수있는 더 좋은 방법이 있습니까? 내장은 거기인가 ". 항상 이름 대신에 직접 람다 식을 결합하는 할당 문의 DEF 문을 사용하여"

lambda *args, **kwargs: None 
+5

명명 된 함수를 정의하기 위해'lambda '를 사용하는 것은 Pythonic이 아닙니다. 'def'를 사용하십시오. – geoffspear

답변

31

PEP8에 따르면, 당신이해야 그래서, 내가 바꿀 것 한 가지입니다

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

그러나, 나는이 일을 더 파이썬 방법은 생각 :

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

확인. 나는 합법적 인 기본 콜백을 가졌다면, 그것을 def로 디폴트로 넘겨 줄 수 있다고 생각한다. 그렇지 않으면 나는 지루한 오래된 것을 사용할 것이다. 블레치! – Scruffy

+0

매우 유용한 편집 주셔서 감사합니다! – Bahrom

+0

때때로 perform_task는 복잡한 작업을 수행하고 가능한 한 많은 것을 배제하려고합니다. blank_fn 방식을 사용하는 것과 같은 여러 단계를 거치면 관리하기 쉬운 코드가 생성 될 수 있습니다. 코드를 최적화하는 것이 아니라 코드를 깨끗하게 유지하는 것이 더 중요합니다. –

관련 문제