[Python-3000] Change to class construction?

Guido van Rossum guido at python.org
Sat Jul 7 00:32:15 CEST 2007


On 7/6/07, Phillip J. Eby <pje at telecommunity.com> wrote:
> At 05:00 PM 7/6/2007 +0200, Georg Brandl wrote:
> >Collin Winter schrieb:
> > > While experimenting with porting setuptools to py3k (as of r56155), I
> > > ran into this situation:
> > >
> > > class C:
> > >   a = (4, 5)
> > >   b = [c for c in range(2) if a]
> > >
> > > results in a "NameError: global name 'a' is not defined" error, while
> > >
> > > class C:
> > >   a = (4, 5)
> > >   b = [c for c in a]
> > >
> > > works fine. This gives the same error as above:
> > >
> > > class C:
> > >   a = (4, 5)
> > >   b = [a for c in range(2)]
> > >
> > > Both now-erroneous snippets work in 2.5.1. Was this change intentional?
> >
> >It is at least intentional in the sense that in 3k it works the same as with
> >genexps, which give the same errors in 2.5.
>
> This looks like a bug to me.  A list comprehension's local scope
> should be the locals of the enclosing code, even if its loop indexes
> aren't exposed to that scope.

It's because the class scope is not made available to the methods.
That is intentional. Georg's later example is relevant:

class C:
  a = 1
  def f(self): print(a)   # <-- raises NameError for 'a'

This is in turn intentional so that too-clever kids don't develop a
habit of referencing class variables without prefixing them with self
or C.

The OP's use case is rare enough that I don't think we should do
anything about it.

-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-3000 mailing list