On Sat, Dec 12, 2020 at 06:00:17PM -0800, Ethan Furman wrote:
> 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.

I don't know how to interpret that. Surely *in practice* enums are 
always going to be related in some sense? I don't expect to create an 
enum class like this:

    class BunchOfRandomStuff(Enum):
        ANIMAL = 'Mustela nivalis (Least Weasel)'
        PRIME = 503
        EULER_MASCHERONI_CONSTANT = 0.5772156649015329
        BEST_PICTURE_1984 = 'Amadeus'
        DISTANCE_MELBOURNE_SYDNEY = (16040497, "rack mount units")

in any meaningful piece of code, although of course such an eclectic 
collection is syntactically legal, even if semantically meaningless.

If I did create such an unusual collection of enums, what is the 
standard Enum lacking that makes it "not great"? It seems to work fine 
to me.


[...]
> 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

I don't understand this. Are you suggesting that NamedValues will have a 
`type` attribute **like Enum**, or **in addition** to what Enum provides 
(value and name)?

I cannot see any sign of a `type` attribute on Enums, but maybe I'm 
having a Boy Look.

What is the `type` attribute of a NamedValue instance?


[snip a bunch of ways that NamedValues are exactly like Enums]

> unlike Enum, duplicates are allowed

Um, do you mean duplicate names? How will that work?

    class Stuff(NamedValues):
        SPAM = 1
        SPAM = 2

    Stuff.SPAM  # what is this???

Enums support duplicate values, and I can't see how duplicate names 
could work, so I don't get this.


> unlike Enum, new values can be added after class definition

Is there a use-case for this?

If there is such a use-case, could we not just given Enums an API for 
adding new values, rather than invent a whole new Enum-by-another-name?


> 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).

Sorry, I don't get that either. How can Enums not be used "as-is"? What 
does that mean?

Are you suggesting that NamedValue subclasses will automatically insert 
`int` into their MRO? Otherwise, I don't get how there can be no 
functional difference between a NamedValue subclass that inherits from 
int and one that doesn't. Surely you aren't suggesting that this must be 
meaningful?

    class Spam(NamedValue):
        EGGS = "My hovercraft is full of eels."

    Spam.EGGS + 1  # returns what?

Of course I don't think you mean that should actually work, but I cannot 
think what other interpretation to give your description.


> 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")
[...snip additional name/value pairs...]

> and in use:
> 
>     >>> K.DIGITS
>     K.DIGITS
>     >>> K.DIGITS.name
>     'DIGITS'
>     >>> K.DIGITS.value
>     frozenset("0123456789")

Why not just use an Enum?

Sorry Ethan, perhaps I am being slow today, but apart from that "add new 
members after creation" I fail to see how this is anything but just an 
Enum. What am I missing?


-- 
Steve
_______________________________________________
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/5IYULPZNAG4MGTM7UVVAQ7OK5J3ORXSZ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to