Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
186 changes: 186 additions & 0 deletions docs/library/enum.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
:mod:`enum` -- MicroPython Enum class like in the Python
========================================================

.. module:: enum
:synopsis: MicroPython Enum class like in the Python

This module implements enumeration Enum class for the MicroPython.

class Enum -- enumeration
-------------------------

Class Enum is based in dictionary `dict` class and provides a way to create enumeration
objects with key-value pairs.

Constructor
-----------

.. class:: Enum(arg)

Construct and return a new Enum object using the following parameter:

- *arg* is the dictionary of key-value pairs.

Usage example::

from enum import Enum
e = Enum({"X": 1, "Y": 2}) # create Enum object from dictionary of key-value pairs
print(e)
print("add new key-value pair")
e.A = 'A' # add new key-value pair
e.B = 'B'
print(e)
print("e.X:", e.X) # get value from key
print("e.X.value:", e.X.value) # get value from key
print("e(e.X):", e(e.X)) # get value from key
print("e.key_from_value(1):", e.key_from_value(1)) # get key from value
print("e.is_value(e.B):", e.is_value(e.B))
print("del e.B")
del e.B # delete key-value pair
print(e)
print("e.is_value('B'):", e.is_value('B')) # check if the value is in the Enum object
print("e.B: will raise the KeyError exception")
print(e.B) # raise an exception due to no such a key attribute

Output is::

Enum({'Y': 2, 'X': 1})
add new key-value pair
Enum({'A': 'A', 'B': 'B', 'Y': 2, 'X': 1})
e.X: 1
e.X.value: 1
e(e.X): 1
e.key_from_value(1): Enum.X
e.is_value(e.B): True
del e.B
Enum({'A': 'A', 'Y': 2, 'X': 1})
e.is_value('B'): False
e.B: will raise the KeyError exception
Traceback (most recent call last):
File "<stdin>", line 234, in <module>
File "<stdin>", line 126, in __getattr__
KeyError: no such attribute: B

Methods
-------

.. _Enum_append:
.. method:: Enum.append(arg, **kw_args):

Append key-value pairs with the following parameters:

- *arg* is the dictionary of key-value pairs.
- *kw_args* are key1=value1, key2=value2, ...

.. method:: Enum.is_value(value)

Check if the value is in the Enum object.
Returns True if the value is in the Enum object, and False otherwise.

.. method:: Enum.key_from_value(value)

Returns the key from the value. If a value is not in the Enum object, it raises an exception.

Usage example::

from enum import Enum

class State(Enum):
Stop = 10
Run = 20
Ready = 30

state = State()
print("state:", State())

current_state = state.Stop
print("current_state:", current_state, state.key_from_value(current_state))
if current_state == state.Stop:
print(" Stop state")
if current_state != state.Ready:
print(" Not a Ready state")
print(" Run!")
current_state = state.Run
print("current_state:", current_state, state.key_from_value(current_state))
# some process
i = -1
while current_state != state.Ready:
i += 1
if state.is_value(i):
if state(i) == state.Ready:
current_state = state.Ready
print(".", end="")
print()
print("current_state:", current_state, state.key_from_value(current_state))
print("Done!")

Output is::

state: State({'Ready': 30, 'Stop': 10, 'Run': 20})
current_state: 10 State.Stop
Stop state
Not a Ready state
Run!
current_state: 20 State.Run
...............................
current_state: 30 State.Ready
Done!

.. warning::

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
Comment on lines +131 to +144
Copy link
Contributor Author

@IhorNehrutsa IhorNehrutsa Mar 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dpgeorge
There is solution for this trouble.
We need to remove enums from internal State.__dict__

>>> class State(Enum):
        Stop = 10
        Run = 20
        Ready = 30

>>> dir(State)
['__dir__', '__call__', '__class__', '__delitem__', '__getattr__', '__getitem__', '__init__', '__len__', '__module__', '__name__', '__qualname__', '__repr__', '__setitem__', '__str__', 'append', 'clear', 'copy', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', '__bases__', '__delattr__', '__dict__', '__setattr__', 'fromkeys', '_get_enums_from_class', '_update', 'is_value', 'key_from_value', 'Stop', 'Run', 'Ready']
>>> State.__dict__
{'__qualname__': 'State', 'Ready': 30, '__module__': '__main__', 'Stop': 10, 'Run': 20}
>>> 

I tried, but I couldn't do it.


Function
--------

.. function:: enum(**kw_args)

Returns an Enum object from the following parameters:

- *kw_args* are key1=value1, key2=value2, ...

Usage examples::

from enum import enum
e = enum()
repr(e)
str(e)
e = enum(X=1, Y=2.0, A='A', ON=True)
repr(e)
str(e)
e.X
e.Y
e.A
e.ON

Output::

'{}'
'Enum({})'
"{'A': 'A', 'ON': True, 'Y': 2.0, 'X': 1}"
"Enum({'A': 'A', 'ON': True, 'Y': 2.0, 'X': 1})"
1
2.0
'A'
True

.. note::

ABC

.. seealso::

See `enum_test.py <https://github.com/micropython/micropython-lib/pull/980/files/>`_ and `enum.py <https://github.com/micropython/micropython-lib/pull/980/files/>`_
1 change: 1 addition & 0 deletions docs/library/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ library.
builtins.rst
cmath.rst
collections.rst
enum.rst
errno.rst
gc.rst
gzip.rst
Expand Down
Loading
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy