Should nested classes in an Enum be Enum members?
Ethan Furman
ethan at stoneleaf.us
Thu Jun 28 11:36:47 EDT 2018
On 06/28/2018 01:11 AM, Steven D'Aprano wrote:
> On Wed, 27 Jun 2018 07:48:53 -0700, Ethan Furman wrote:
>
>> [Note: there is a similar thread on Python-Ideas, if you would like to
>> respond there.]
>>
>> Consider the following Enum definition:
>>
>> class Color(Enum):
>> RED = 1
>> GREEN = 2
>> BLUE = 3
>> @property
>> def lower(self):
>> return self.name.lower()
>> def spam(self):
>> return "I like %s eggs and spam!" % self.lower
>> class SomeClass:
>> pass
>>
>> Which of the above Color attributes are enums, and which aren't?
> (In hindsight perhaps you should have called the class EnumType so that
> ambiguity would not exist. Then an enum would *always* refer to the
> members Color.RED etc, and never to Color itself.)
The problem then is the ambiguity between EnumMeta and EnumType. :/
>> Answer:
>>
>> - RED, GREEN, and BLUE are members
>> - lower and spam() are not
>> - SomeClass /is/ a member (but not its instances)
>
> Is that by accident or by design?
By design. It is entirely possible to want an enum of types (int, float, str, etc.).
>> Question:
>>
>> Should `SomeClass` be an enum member? When would it be useful to
>> have an embedded class in an Enum be an enum member?
>
> I honestly cannot think of any reason to nest a class inside of an Enum
> class. But if I did, I would probably want it to be just a regular class,
> and not an enum member.
>
> If I wanted to nest an Enum class inside an Enum class (but why???) I'd
> just inherit from Enum:
>
> class Colour(Enum):
> class PrimaryColour(Enum):
> RED = 1
> GREEN = 2
> BLUE = 3
> OCTARINE = 8
> class SecondaryColour(Enum):
> PUCE = 101
> MAUVE = 102
> BEIGE = 103
> TEAL = 104
This really seems to be the sticking point -- what should an Enum of Enums look like? For example, should the above do
--> list(Colour)
[Colour.PrimaryColour <...>, Colour.SecondaryColour <...>]
or something else?
>> The only example I have seen so far of nested classes in an Enum is when
>> folks want to make an Enum of Enums, and the nested Enum should not
>> itself be an enum member. Since the counter-example already works I
>> haven't seen any requests for it. ;)
>>
>> So I'm asking the community: What real-world examples can you offer for
>> either behavior? Cases where nested classes should be enum members, and
>> cases where nested classes should not be members.
>
> Is this a trick question?
Heh. Not at all. It is entirely possible to have a real use-case which we cannot model the way we want in code.
--
~Ethan~
More information about the Python-list
mailing list