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

Ethan Furman ethan at stoneleaf.us
Sun Apr 28 04:22:48 CEST 2013

On 04/27/2013 07:01 PM, Greg Ewing wrote:
> PJ Eby wrote:
>> On Sat, Apr 27, 2013 at 2:27 PM, Ethan Furman <ethan at stoneleaf.us> wrote:
>>> I filed bug http://bugs.python.org/issue17853 last night.
>> About the only workaround I can see is to put "Season = Season" at the
>> top of a class that uses this inside a function definition,
> 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.

You certainly have a point about DRY, and generally I agree with you, but given the nature of Enums I can see a little 
extra RY being useful.

Regardless of the outcome for Enums, I can see another metaclass doing the same kind of thing and having it work just 
fine until an unsuspecting soul tries to reuse an inserted name further down the function and suddenly the whole thing 
blows up on him.

Now, I'll grant you it's not like  a seg fault, but it would be nice if Python followed its own lookup rules.


More information about the Python-Dev mailing list