Python3でEnumを継承しようと思ったけどできなかった話

Pythonではほぼclassと同様の構文でEnumを使うことができますが、じゃあclassと同様に継承ができるのか試してみたという話です。結論から言うとできません。

こういうことをやってみました

まず Prop というEnumを以下の様に定義します。

from enum import Enum, auto

class Prop(Enum):
    good = auto()
    bad = auto()

次に Prop を継承して ChildProp を定義します。

class ChildProp(Prop):
    medium = auto()
    acceptable = auto()

ChildProp を以下の様に使ってみます。

print(f'good: {ChildProp.good}')
print(f'bad: {ChildProp.bad}')
print(f'medium: {ChildProp.medium}')
print(f'acceptable: {ChildProp.acceptable}')

結果

結果は以下の様になりました。

Traceback (most recent call last):
  File "<stdin>", line 16, in <module>
  File "<stdin>", line 8, in main
  File "/usr/local/Cellar/python@3.9/3.9.2/Frameworks/Python.framework/Versions/3.9/lib/python3.9/enum.py", line 167, in __prepare__
    metacls._check_for_existing_members(cls, bases)
  File "/usr/local/Cellar/python@3.9/3.9.2/Frameworks/Python.framework/Versions/3.9/lib/python3.9/enum.py", line 542, in _check_for_existing_members
    raise TypeError(
TypeError: ChildProp: cannot extend enumeration 'Prop'

enumerationは継承できないと言われました。なぜかと思って調べてみたところ、基本的にEnumは継承できないらしいです (参考)。