[Python-3000] Change to class construction?
Phillip J. Eby
pje at telecommunity.com
Mon Jul 9 18:03:28 CEST 2007
At 06:13 PM 7/9/2007 +0300, Guido van Rossum wrote:
>On 7/9/07, Phillip J. Eby <pje at telecommunity.com> wrote:
> > At 09:03 PM 7/9/2007 +1000, Nick Coghlan wrote:
> > >However, I will point out that setting class attributes via locals() is
> > >formally undefined (it happens to work in current versions of CPython,
> > >but there's no guarantee that will always be the case).
> >
> > As of PEP 3115, it's no longer undefined for class statements.
>
>Where does it say so? To be honest, I don't know where ti find Nick's
>claim in the reference manual.
I assume Nick is referring to:
http://www.python.org/doc/2.2/ref/execframes.html
which says it's undefined. I can't seem to find where this section
went to in 2.3 and beyond, or anything that says what happens with
non-dictionary objects, except:
http://docs.python.org/ref/exec.html
which makes a much stronger claim:
"The built-in functions globals() and locals() return the current
global and local dictionary, respectively"
and also states that as of 2.4, exec allows the use of any mapping
object as the locals. There isn't any mention of the fact that
locals() may not be writable, which should probably be considered an error.
>But I'm surprised that you read
>anything about locals() into that PEP, as it doesn't mention that
>function at all.
Correct -- which means that either the PEP is in error, or the
semantics of locals() must be that the actual namespace in use is returned.
My reasoning: since PEP 3115 allows an arbitrary mapping object to be
used, there is no way that such an object can be converted to a
read-only dictionary, and the current definition (as I understand it)
is that locals() returns you either the actual local namespace
object, or a "dictionary representing the ... namespace" (per the
reference manual).
Since PEP 3115 does not require that there be any way of converting
the arbitrary mapping object into a dictionary (or even that there be
any pre-defined way of *reading* its contents!) there is no way that
locals() can fulfill its existing contract *except* by returning that object.
QED. Well, that's the spelled-out reasoning for my intuition,
anyway. :) That doesn't mean the PEP or the specification of
locals() can't change, but it seems to me that if one or the other
doesn't, then modifying class-suite locals() to create class members
implicitly becomes official, since the failure for it to do so would
become a bug in locals(). (Since it will no longer be returning a
"dictionary representing the namespace" if it doesn't return that
mapping object, and can't possibly return anything else that
"represents" the namespace in any meaningful way.)
More information about the Python-3000
mailing list