Thursday, September 26, 2024

Python enum annoyances

I find it very strange that Python does not have a separate type for enum like set, tuple, or list (e.g. dataclasses are another kludge of this language).

To my surprise, I had to learn the hard way that Python enums are  sensitive to the order of parent classes, when you use inheritance. This does not make any sense to me that the order of base classes matters.

I am using the PyCharm Community Edition IDE (version 2024.1.6 Build #PC-241.19072.16, built on August 8, 2024) and and Python version 3.12.

Caveat: I am not an expert Python developer

Anyway, today I wasted probably at least an hour to figure out following, to me cryptic error message from deep within Python:

"class Dummy2(StrEnum, DummyBase):  File "/usr/lib64/python3.12/enum.py", line 606, in __new__     raise exc.with_traceback(tb)

  File "/usr/lib64/python3.12/enum.py", line 596, in __new__

    enum_class = super().__new__(metacls, cls, bases, classdict, **kwds)

TypeError: Cannot create a consistent method resolution order (MRO) for bases StrEnum, DummyBase"


Here is my compacted, simplified replication code for this error:

import os
from enum import StrEnum, unique

@unique
class DummyBase(StrEnum):
    @classmethod
    def dummy_method(cls):
        return 'Here is a dummy'

@unique
class Dummy1(DummyBase, StrEnum):
    M1 = 'Member1'
    M2 = 'Member2'

@unique
class Dummy2(StrEnum, DummyBase):
    M1 = 'Member1'
    M2 = 'Member2'

def run():
    os.system('clear')
    print(Dummy1.dummy_method())
    print(Dummy2.dummy_method())

run()

Conclusion: Dummy1 works fine, but Dummy2 crashes! Grrr!

Google AI search also confirms that you can use inheritance on enums (see last sentence):



No comments: