[Python-Dev] class name spaces inside an outer function

Ethan Furman ethan at stoneleaf.us
Sun Apr 28 08:10:42 CEST 2013


On 04/27/2013 09:20 PM, Guido van Rossum wrote:
> On Saturday, April 27, 2013, Greg Ewing wrote:
>
>     This whole business can be avoided by doing things differently
>     in the first place. Instead of initialising the enum items by
>     calling the class, just assign a tuple of args to the name
>     and have the metaclass make the constructor call.
>
>        class Planet(Enum):
>          MERCURY = (3.303e+23, 2.4397e6)
>          VENUS   = (4.869e+24, 6.0518e6)
>          EARTH   = (5.976e+24, 6.37814e6)
>          MARS    = (6.421e+23, 3.3972e6)
>          JUPITER = (1.9e+27,   7.1492e7)
>          SATURN  = (5.688e+26, 6.0268e7)
>          URANUS  = (8.686e+25, 2.5559e7)
>          NEPTUNE = (1.024e+26, 2.4746e7)
>
>          def __init__(self, mass, radius):
>            self.mass = mass
>            self.radius = radius
>
>     I think that's better anyway, since it avoids aggravated
>     violation of DRY by repeating the class name umpteen times.
>
> If you want something like this, doyou really have to inherit from Enum?

If I'm saying what you already know I apologize now, but this thread is about what happens when:

   class InsertsName(type):
     @classmethod
     def __prepare__(metacls, cls, bases):
         classdict = {'new_name': lambda: 'haha!'}
         return classdict

   def test():
     new_name = 'Jose'   # if here will result in str not callable error
     class SomeClass(metaclass=InsertsName):
        surprise = new_name()
     new_name = 'Clara'  # if here will result in NameError: free variable...

However, if that class definition is either top level, or if the function itself does not define nor use the 'new_name', 
there is no problem.

Enum was being used in the example because that's what I was toying with when I found the problem.

--
~Ethan~


More information about the Python-Dev mailing list