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/