lambda *args, **kwargs: None
43,236
According to PEP8, you should "Always use a def statement instead of an assignment statement that binds a lambda expression directly to a name." So, one thing I would change is:
def blank_fn(*args, **kwargs):
pass
However, I think a more pythonic way to do this is:
def perform_task(callback=None):
print 'doing stuff'
if callback is not None:
callback('x', 'y', z='z')
There shouldn't be any need to call a function that does nothing. Truth value testing is cheaper than function calling.
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
Author by
Scruffy
Patent Examiner. Python hobbyist. Patent data retrieval and analysis addict.
Updated on February 23, 2020Comments
-
Scruffy over 4 years
consider:
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' )
The motivation for doing it this way is I don't have to put in logic to check if callback has been assigned because it defaults to blank_fn which just does nothing.
This works, but is there some reason I shouldn't do it? Is it pythonic? Is there a better way to do it? Is there a built-in for:
lambda *args, **kwargs: None
-
Scruffy almost 11 yearsOk. I suppose if I did have a legit default callback I could def it and pass it as default. Otherwise I'll use the boring old if... None:. Blech!
-
Dawid Toton almost 7 yearsSometimes it happens that perform_task does some complicated job and you want to factor as much as possible out of it. Many small steps like taking the blank_fn way can lead to a nice, manageable code. And often it is more important to keep the code clean rather than optimize it.
-
Cruncher almost 5 yearsIt seems like extremely poor practice to use mock anywhere outside of a test suite. What advantage does this have over just declaring an empty function? This is probably much slower too