[Python-Dev] PEP 435 -- Adding an Enum type to the Python standard library

Ethan Furman ethan at stoneleaf.us
Fri Apr 26 04:25:06 CEST 2013


On 04/25/2013 07:09 PM, Glenn Linderman wrote:
> On 4/25/2013 4:53 PM, Ethan Furman wrote:
>> On 04/25/2013 04:26 PM, Glenn Linderman wrote:
>>> My question is, once an enumeration is defined, is there a way, short of element-by-element assignment, to import the
>>> individual enumeration instances into the current namespace, so that I can say "red" instead of "Color.red" ? I
>>> understand the benefits of avoiding name collisions when there are lots of enumerations, and lots of opportunities for
>>> name collections between, say, RGBColor and CYMKColor... but there are lots of uses for enumerations where the
>>> subsidiary namespace is just aggravating noise.
>>
>> You mean something like:
>>
>> --> class Color(Enum):
>> ...     RED = 1
>> ...     GREEN = 2
>> ...     BLUE = 3
>>
>> --> Color.register()  # puts Color in sys.modules
>>
>> --> from Color import *  # doesn't work in a function, though :(
>>
>> --> BLUE
>> Color.BLUE
>
> Something like that, but that works in a function too :)

Not in Py3 it doesn't:

Python 3.2.3 (default, Oct 19 2012, 19:53:16)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
--> def test():
...   from sys import *
...   print('huh')
...
   File "<stdin>", line 1
SyntaxError: import * only allowed at module level


>> Yeah, that would be nice.  ;)  A bit dangerous, though -- what if another module does the same thing, but its Color
>> is different?
>>
>> Better would be:
>>
>> --> Color.export(globals())  # put the enumerators in globals
>>
>> --> RED
>> Color.RED
>
> Globals? locals should be possible too.

At least in Cpython, updating locals() does not work in functions.

> Or even something like:
>
> with Color:
>         BLUE
>         RED
>
> Although the extra indentation could also be annoying.
>
> One wouldn't want the module defining Color to automatically 'export' the colors: but rather a way to request an
> 'export' them into a particular scope. That way the proliferation of names into scopes is chosen by the programmer.
>
> import module_containing_color
> module_containing_color.Color.export_enumerations( globals )
>
> or
>
> import module_containing_color
> module_containing_color.Color.export_enumerations( locals )
>
> Or maybe locals is implicit, and in the file scope of a module, locals are globals anyway, so doing
>
> module_containing_color.Color.export_enumerations()

locals() can't be implicit, at least not without deep black magic of inspecting frames in the call stack -- which is 
hardly portable.

--
~Ethan~


More information about the Python-Dev mailing list