Enum is great!  Okay, okay, my opinion might be biased.  ;)

There is one area where Enum is not great -- for a bunch of unrelated values. What would be nice is if we had something similar to Enum for the

- repr()
- constantness of the name/value relationship

While I was looking in the stdlib for an example, I came across sre_constants, which was chock full of constants -- and it even has a minimal version of what I'm proposing:

    class _NamedIntConstant(int):
        def __new__(cls, value, name):
            self = super(_NamedIntConstant, cls).__new__(cls, value)
            self.name = name
            return self

        def __repr__(self):
            return self.name


My proposal, compared/contrasted with Enum:

like Enum, NamedValues will be in collections (a class) that will keep those names from being deleted or rebound to other values

like Enum, NamedValues will have `value` and `name` attributes, and also a 
`type` attribute

like Enum, NamedValues are attributes of their containing class

like Enum, iterating over the containing class will yield the names/values 
defined

like Enum, a class of NamedValues do not have to all be the same data type 
unless one is mixed in

like Enum, a particular name/value combination is a singleton

unlike Enum, duplicates are allowed

unlike Enum, new values can be added after class definition

unlike Enum, a NamedValue can always be used as-is, even if no data type has been mixed in -- in other words, there is no functional difference between MyIntConstants(int, NamedValue) and MyConstants(NamedValue).

If sre_constants was using a new data type, it should probably be IntEnum instead. But sre_parse is a good candidate for NamedValues:


    class K(NamedValues):
        DIGITS = frozenset("0123456789")

        OCTDIGITS = frozenset("01234567")
        HEXDIGITS = frozenset("0123456789abcdefABCDEF")
        ASCIILETTERS = 
frozenset("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

        WHITESPACE = frozenset(" \t\n\r\v\f")

        _REPEATCODES = frozenset({MIN_REPEAT, MAX_REPEAT})
        _UNITCODES = frozenset({ANY, RANGE, IN, LITERAL, NOT_LITERAL, CATEGORY})

and in use:

    >>> K.DIGITS
    K.DIGITS
    >>> K.DIGITS.name
    'DIGITS'
    >>> K.DIGITS.value
    frozenset("0123456789")

Thoughts?

--
~Ethan~
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/Q4UU6U4FEADHFHJQ6XMH5MQMEASUQPYZ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to