[Python-ideas] Tweaking closures and lexical scoping to include the function being defined
Guido van Rossum
guido at python.org
Wed Sep 28 00:32:43 CEST 2011
On Tue, Sep 27, 2011 at 3:24 PM, Arnaud Delobelle <arnodel at gmail.com> wrote:
> On 27 September 2011 22:23, Guido van Rossum <guido at python.org> wrote:
>> On Tue, Sep 27, 2011 at 2:04 PM, Arnaud Delobelle <arnodel at gmail.com> wrote:
>>> On 27 September 2011 21:38, Greg Ewing <greg.ewing at canterbury.ac.nz> wrote:
>>> [...]
>>>> As I remember, the idea foundered because it was thought
>>>> too confusing to have an expression that was written
>>>> inside the function but evaluated outside of it. If
>>>> we're seriously considering the current proposal,
>>>> presumably we've gotten over that? Or is it still a
>>>> valid objection?
>>>
>>> I have been reading this thread from the start and FWIW, it's
>>> something that I have been feeling uncomfortable about. I value the
>>> guarantee that no code in the body of a def statement is executed when
>>> the def statement itself is executed. This proposal would break this
>>> guarantee.
>>
>> That seems a guarantee made up specifically to prevent this proposal.
>
> I wouldn't do this :) I like new things.
>
>> What benefit do you see from it?
>
> It keeps things simple. To be specific, when I read code I can "fold"
> (mentally or with the help of a code editor) the body of a def
> statement, knowing that I won't miss anything until the function is
> called. So the following won't raise:
>
> [some code]
>
> x = 42
> def foo():
> [I don't need to read the body]
> assert x == 42
>
> But now def statements can have non-obvious side-effects. For example:
>
> def spam_x():
> global x
> x = "spam"
>
> x = 42
> def foo():
> # Some body
> nonlocal y from spam_x()
> # More body
> assert x == 42
>
> I may be unduly worrying about this, but it feels to me that it
> lessens the overall tidiness of the language. I would much rather
> there was a way to initialise these "own" variables outside the body
> of the function.
Yes, you have a point. Hiding side effects this way could be nasty,
and this is actually the first point in favor of the default argument
hack I've heard in a while. :-)
C++ has special syntax to force the programmer to write certain things
after the argument list but before the function body (I think only for
constructors). I have seen too many constructors with a short argument
list, a very short body, and a ton of code cramped in between, to like
the idea very much: even though it is semantically something totally
different, syntactically it would have the same awkwardness.
--
--Guido van Rossum (python.org/~guido)
More information about the Python-ideas
mailing list