[Python-ideas] Enums

Michael Foord fuzzyman at gmail.com
Fri Jul 29 01:42:13 CEST 2011


On 28 July 2011 18:12, 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)
>
>
Why not Colors.inject(__name__)?

This is one line less, the same everywhere, and covers the common case. You
could dispatch on string / object if you want to support both.

Michael



> .inject() takes anything that implements the setattr() protocol.  So that
> you
> could then do:
>
>    >>> import foo
>    >>> foo.red
>    Colors.red
>
> 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.
>
> 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
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/mailman/listinfo/python-ideas
>
>


-- 

http://www.voidspace.org.uk/

May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.
-- the sqlite blessing http://www.sqlite.org/different.html
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20110729/21228ecf/attachment.html>


More information about the Python-ideas mailing list