python lambda default-arguments

python - lambda*args,** kwargs: Ninguno



default-arguments (1)

De acuerdo con PEP8 , debe "Usar siempre una instrucción def en lugar de una instrucción de asignación que vincule una expresión lambda directamente a un nombre". Entonces, una cosa que cambiaría es:

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

Sin embargo, creo que una forma más pitónica de hacer esto es:

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

No debería haber ninguna necesidad de llamar a una función que no hace nada. La prueba del valor de verdad es más barata que la función de llamada.

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

considerar:

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 motivación para hacerlo de esta manera es que no tengo que poner en lógica para verificar si se ha asignado la devolución de llamada porque el valor predeterminado es blank_fn que simplemente no hace nada.

Esto funciona, pero ¿hay alguna razón por la que no debería hacerlo? ¿Es pitónico? Hay una mejor manera de hacerlo? ¿Hay una incorporada para:

lambda *args, **kwargs: None