[Python-Dev] [Python-checkins] peps: Pre-alpha draft for PEP 435 (enum). The name is not important at the moment, as (original) (raw)
Anders J. Munch ajm at flonidan.dk
Wed Feb 27 17:34:35 CET 2013
- Previous message: [Python-Dev] [Python-checkins] peps: Pre-alpha draft for PEP 435 (enum). The name is not important at the moment, as
- Next message: [Python-Dev] [Python-checkins] peps: Pre-alpha draft for PEP 435 (enum). The name is not important at the moment, as
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hi, offering my DKK 0.50 on the subject. I've used an in-house enum type for the better part of a decade - put up at http://unicollect.dk/download/oss/dc_enum.zip for inspiration.
I'm partial to an int subclass, or at least something very int-like, because wrapping C libraries is such a major use case. Enums should support all the operations that C enum's do: indexing, ordering, bitwise math and unnamed values.
There's a whole bunch of these wrapped C enum's in the standard library, e.g. in the os, stat and urllib modules. Wouldn't it be good to see them converted to enumeration values, to make them sort-of self-documenting and sort-of typechecked?
- About unnamed values: Suppose for example you gather up some
stat constants in an enum like this:
class S_I(Enum):
XOTH = 1
WOTH = 2
ROTH = 4
RWXO = 7
XGRP = 8
WGRP = 16
RGRP = 32
RWXG = 56
XUSR = 64
EXEC = 64
WRITE = 128
WUSR = 128
RUSR = 256
READ = 256
RWXU = 448
SVTX = 512
SGID = 1024
SUID = 2048
FIFO = 4096
FCHR = 8192
FDIR = 16384
FBLK = 24576
FREG = 32768
FLNK = 40960
FSOCK = 49152
Now what happens if you do
SI(5) ?
This should not raise an exception: 5 is the perfectly valid combination of XOTH and ROTH. Supporting unnamed values is also useful when reading integer values from an external source - file, network, serial port - where typically you'd first convert the received value to the enum type before doing any processing. If converting to enum type may raise an exception, that would force you to print raw integer values in diagnostics, where you'd rather have printed the userfriendly symbolic names.
- The repr of an enum value should be short and sweet. Because sometimes you'll be looking at long lists of information with 2-3 of these on every line, and then <EnumValue: Colors.blue [int=3]> is just going to be annoyingly verbose. This is how my library eventually printed enums:
SI.ROTH S_I.ROTH SI(4) S_I.ROTH SI(5) S_I(5) print(SI(4)) S_I.ROTH(4) print(SI(5)) S_I.?(5)
- A final thing, attempting to compare or convert values from different enum classes should be a TypeError. E.g. in wxPython, it's easy to mistake wx.OK and wx.ID_OK, and a friendly TypeError message is a good way of detecting this early.
regards, Anders
- Previous message: [Python-Dev] [Python-checkins] peps: Pre-alpha draft for PEP 435 (enum). The name is not important at the moment, as
- Next message: [Python-Dev] [Python-checkins] peps: Pre-alpha draft for PEP 435 (enum). The name is not important at the moment, as
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]