[Python-ideas] Enums
Guido van Rossum
guido at python.org
Thu Jul 28 19:41:05 CEST 2011
On Thu, Jul 28, 2011 at 10:12 AM, Barry Warsaw <barry at python.org> wrote:
> On Jul 27, 2011, at 07:21 PM, Guido van Rossum wrote:
>
>>It's just possible that there's no way to define enums that neither
>>introduced a new (class) scope nor requires a lot of redundant typing.
>
> Ezio had a very nice suggestion, which I've implemented in my experimental
> branch, e.g.:
>
> >>> foo = sys.modules['foo']
> >>> Colors.inject(foo)
>
> .inject() takes anything that implements the setattr() protocol. So that you
> could then do:
>
> >>> import foo
> >>> foo.red
> Colors.red
Nice, but it still hides the definitions from static analyzers.
It seems I am almost unique in my insistence that Python's dynamic
features be used very sparingly. :-)
> In my experimental branch I've also made EnumValues subclasses of ints. This
> breaks one test in my Mailman 3 test suite, since I was using a custom encoder
> for json.dumps() which knew how to encode EnumValues. However, the json
> module doesn't allow you to override the encoding of basic types, so whereas
> before my extended encoder's .default() method got called for all the
> EnumValues being encoded in a REST response, they are now encoded
> *incorrectly* as their integer values by default. I'd need to figure out a
> workaround for that, but it does show that EnumValue-as-int is a backward
> incompatible change.
Sure. Almost any change is backward incompatible...
> A few other things I've done in my experimental branch:
>
> - Added an optional argument `iterable` to make_enum() so that you can use the
> convenience function to auto-assign integer values other than sequentially
> incrementing from 1. E.g.
>
> >>> def enumiter():
> ... start = 1
> ... while True:
> ... yield start
> ... start <<= 1
> >>> make_enum('Flags', 'a b c d e f g', enumiter())
> <Flags {a: 1, b: 2, c: 4, d: 8, e: 16, f: 32, g: 64}>
>
> - Renamed attributes .enumclass -> .enum and .enumname -> .name (hey, if
> you're going to be backward incompatible...)
>
> If you want to play with it:
>
> $ bzr branch lp:~barry/flufl.enum/asint
>
> or take a look at:
>
> http://bazaar.launchpad.net/~barry/flufl.enum/asint/files
>
> The new using.txt file is at:
>
> http://tinyurl.com/3s85oq7
>
> Let me know what you think, while I figure out a workaround for the
> incompatible change.
>
> Cheers,
> -Barry
>
--
--Guido van Rossum (python.org/~guido)
More information about the Python-ideas
mailing list