[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