[Python-Dev] PEP 8: Discourage named lambdas?
Mike Klaas
mike.klaas at gmail.com
Sat May 3 02:23:27 CEST 2008
On 2-May-08, at 4:03 PM, Terry Reedy wrote:
> Some people write
> somename = lambda args: expression
> instead of the more obvious (to most people) and, dare I say, standard
> def somename(args): return expression
>
> The difference in the result (the only one I know of) is that the
> code and
> function objects get the generic name '<lambda>' instead of the more
> informative (in repr() output or tracebacks) 'somename'. I consider
> this a
> disadvantage.
>
> In the absence of any compensating advantages (other than the trivial
> saving of 3 chars), I consider the def form to be the proper Python
> style
> to the point I think it should be at least recommended for the
> stdlib in
> the Programming Recommendations section of PEP 8.
>
> There are currently uses of named lambdas at least in urllib2. This
> to me
> is a bad example for new Python programmers.
>
> What do our style mavens think?
I'm not a style maven, but I'll put forward why I don't think this is
bad style. Most importantly, these statements can result from
sensible changes from what is (I believe) considered good style.
For example, consider:
registerCallback(lambda: frobnicate(7))
what if there are too places that the callback needs to be registered?
registerCallback(lambda: frobnicate(7))
registerCallback2(lambda: frobnicate(7))
DRY leads to factoring this out into a variable in a straightforward
manner:
callback = lambda: frobnicate(7)
registerCallback(callback)
registerCallback2(callback)
Another thing to consider is that the def() pattern is only possible
when the bound variable has no dots. A common pattern for me is to
replace an instances method with a lambda to add monitoring hooks or
disable certain functionality:
inst.get_foo = lambda: FakeFoo()
This is not replacable in one line with a def (or without locals()
detritius). Assuming this is good style, it seems odd that
inst.get_foo = lambda: FakeFoo()
is acceptible style, but
get_foo = lambda: FakeFoo()
isn't.
(I also happen to think that the def pattern is less clear in some
situations, but that speaks more to personal taste so isn't
particularly relevant)
-Mike
More information about the Python-Dev
mailing list