Should nested classes in an Enum be Enum members?
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Thu Jun 28 04:11:18 EDT 2018
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?
The question is ambiguous in the case of SomeClass. It could mean that:
- SomeClass is the same kind of thing as Color (an Enum subclass);
- SomeClass is the same kind of thing as Color.RED (an enum member);
- or neither of the above.
(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.)
Without trying it, or reading ahead, I would not want to guess which was
the case.
[
s
p
o
i
l
e
r
s
p
a
c
e
]
> 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?
> 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
> 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?
:-)
--
Steven D'Aprano
"Ever since I learned about confirmation bias, I've been seeing
it everywhere." -- Jon Ronson
More information about the Python-list
mailing list