[Python-ideas] Allow lambda decorators
Aahz
aahz at pythoncraft.com
Mon Feb 9 06:40:26 CET 2009
On Sun, Feb 08, 2009, Guido van Rossum wrote:
> On Sun, Feb 8, 2009 at 4:41 PM, Carl Johnson <carl at carlsensei.com> wrote:
>>
>> >>> def each_in(seq):
>> ... return lambda f: lambda: [f(item) for item in seq]
>> ...
>> >>> def func_maker():
>> ... @each_in(range(10))
>> ... def fs(i):
>> ... def f():
>> ... return i
>> ... return f
>> ... return fs() #Warning, fs is a function, not a list
>> ...
>> >>> [f() for f in func_maker()]
>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>
> I'm sorry, but you are using two nested lambdas plus a list
> comprehension, and three nested functions here, plus one more list
> comprehension for showing the result. My brain hurts trying to
> understand all this. I don't think this bodes well as a use case for a
> proposed feature.
>
> I'm not trying to be sarcastic here -- I really think this code is too
> hard to follow for a motivating example.
Maybe I've been corrupted by the functional mindset (I hope not!), but I
can follow this. As Carl says, the key is to focus on the scoping
problem:
def func_maker():
fs = []
for i in range(10):
def f():
return i
fs.append(f)
return fs
This creates a list of function objects, but the way scoping works in
Python, every single function object returns 9 because that's the final
value of ``i`` in func_maker(). Living with this wart is an option;
changing Python's scoping rules to fix the wart is probably not worth
considering. Carl is suggesting something in-between, allowing the use
of lambda combined with decorator syntax to create an intermediate scope
that hides func_maker()'s ``i`` from f().
I think that's ugly, but it probably is about the best we can do -- the
other options are uglier.
What I don't know is whether it's worth considering; abusing scope is not
generally considered Pythonic, but we've been slowly catering to that
market over the years. Given my general antipathy to decorators as
obfuscating code, I don't think Carl's suggestion causes much damage.
Carl, let me know if I've accurately summarized you.
--
Aahz (aahz at pythoncraft.com) <*> http://www.pythoncraft.com/
Weinberg's Second Law: If builders built buildings the way programmers wrote
programs, then the first woodpecker that came along would destroy civilization.
More information about the Python-ideas
mailing list