← index #269PR #16842
Related · high · value 5.971
QUERY · ISSUE

Request for package: micropython-enum

openby desowinopened 2018-04-04updated 2025-03-05
enhancement

I would like micropython to have support for IntEnum class. Base Enum would be nice to have, although just bare IntEnum would be enough in my opinion.

11 comments
stlehmann · 2018-04-04

Enums are especially useful when it comes to static type-checking. So it would be great if the implementation of this enum type allowed type-checking via mypy. This means all values need to be an instance of the defined enum-type.

>>> class MyEnum(enum.IntEnum):
...    A = 1
...    B = 2

>>> isinstance(MyEnum.A, MyEnum)
True
lypwig · 2022-02-20

I'm also interested by enum in MicroPython.

In the meantime, I found here this workaround:

def enum(**enums: int):
    return type('Enum', (), enums)

Number = enum(ONE=1, TWO=2, THREE=3)

numbers = (Number.ONE, Number.TWO)
matejcik · 2022-02-20

for type-checking, I'm using the following trick:

if TYPE_CHECKING:
    from enum import IntEnum
else:
    IntEnum = object

class Fruit(IntEnum):
    APPLE = 1
    PEAR = 2

def print_fruit(fruit: Fruit):
    if fruit == Fruit.APPLE:
         print("apple")

print_fruit(Fruit.APPLE)
brotherdust · 2022-10-14

This workaround is excellent! I combined it with const for my purposes:

OP_RW = enum(
        READ = const(0b1),
        WRITE = const(0b1)
    )
esologic · 2022-12-11

+1 for a real implementation of this

i33l · 2023-05-26
class State(int):
    pass

State.OFF = State(0)
State.ON = State(1)

But when have been imported getting "Unresolved attribute reference" warning.

andrewleech · 2023-05-26

+1 for a real implementation of this

The cpython implementation is surprisingly very complicated and relies heavily on metaclasses which aren't supported in micropython:

https://github.com/python/cpython/blob/f585ed19ad00f78ed99ba44be5e333c056076160/Lib/enum.py#L1051

As such any micropython implementation will need to be completely custom really, at which point we need to clearly define which aspects of Enum we want to support first, before figuring out how to implement them!

andrewleech · 2023-05-26
class State(int):
    pass

State.OFF = State(0)
State.ON = State(1)

But when have been imported getting "Unresolved attribute reference" warning.

There are a number of limitations when subclassing builtins in micropython, especially int because behind the scenes it's particularly optimised. Eg. https://docs.micropython.org/en/latest/genrst/builtin_types.html#no-int-conversion-for-int-derived-types-available

bredbord · 2024-03-07

+1 for an implementation of this as well.

CANDIDATE · PULL REQUEST

docs/library/enum.rst: Add Enum class.

openby IhorNehrutsaopened 2025-03-01updated 2025-03-27
docs

Summary

There are several requests to develop the Enum class for MicroPython:

  • #15694
  • #8545
  • #269

Implementation in:
micropython-lib/python-stdlib/enum/enum.py: Add Enum class. #980

Testing

Tested during porting MKS-Servo CAN Interface Library to the MicroPython.
Used port/esp32: Add CAN(TWAI) driver. #12331.

Trade-offs and Alternatives

There is the trouble with the isinstance()/type().

  >>> isinstance(State.Run, State)
  False
  >>> State(State.Ready) == State.Ready
  False
  >>> int(str(State(State.Ready))) == State.Ready
  True
  >>> type(State(State.Ready))
  <class 'State'>
  >>> type(state(State.Ready))
  <class 'int'>
  >>> state(State.Ready) == State.Ready
  True

Quastion: Should enum.py and enum_test.py be placed in the micropython or micropython-lib repository?

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied