Enums which are ordered, by int value, and can be compared with both integers and strings.
Project description
A simple extension of IntEnum used to create ordered StrEnums.
What is an OrderedStrEnum?
Simply, OrderdStrEnums are like StrEnum but have an integer value and their string "value" is equal to their name.
This means that OrderedStrEnum are ordered (by their integer values) and can be compared with both integers and
strings.
For example, if we have an OrderedStrEnum Foo and we want it to contain the strings 'One', 'Two', and 'Three'
in order, we can achieve this as follows:
from ordered_str_enum import OrderedStrEnum
class Foo(OrderedStrEnum):
One = 1
Two = 2
Three = 3
This now gives us the power to compare however we wish, even without case sensitivity
>>> Foo.One == 1
True
>>> Foo.One < 'three'
True
>>> Foo.One <= 'Two'
True
>>> Foo.One > 2
False
We can also get the Enum using the int value or string name
>>> Foo(1)
<Foo.One: 1>
>>> Foo('one')
<Foo.One: 1>
>>> Foo('ONE')
<Foo.One: 1>
It's that simple.
Installation
pip install ordered-str-enum
Then import
from ordered_str_enum import OrderedStrEnum
Check out the source code.
Intersecting OrderedStrEnum
What happens when two different inheritors of OrderedStrEnum intersect (share common entries)?
OrderedStrEnum inherits from IntEnum so they would be compared by their integer values. Though, considering
this class intends to add string comparisons to the mix it could lead to confusion. For example if Foo.A is 1
but Bar.A is -1 the result may not be inherently obvious when comparing Foo.A with Bar.A. It
would not be unlikely to expect Foo.A == Bar.A to return True since they both can be considered equivalent with the
strings 'A' and 'a', but his is not the case as 1 != -1 and so you'd actually get False. This is the result when
comparing the Enums as children of IntEnum.
To prevent this confusion, comparison between different children of OrderedStrEnum is disabled by default. Each
inheriting class has an internal flag marking them as "strict". Comparison between different inheritors will
raise a TypeError unless both have this flag set to False:
class Foo(OrderedStrEnum):
A = 1
class Bar(OrderedStrEnum):
A = 1
Foo.strict()
# True
Bar.strict()
# True
Foo.A == Bar.A
# raises TypeError
Both need to set strict to False
class Foo(OrderedStrEnum, strict=False):
A = 1
class Bar(OrderedStrEnum, strict=False):
A = 1
Foo.strict()
# False
Bar.strict()
# False
Foo.A == Bar.A
# True
Why does OrderedStrEnum exist?
I decided to make this reusable when creating Enums for the days of a week in another project. See the days of the week implementation: weekdays-enum
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ordered_str_enum-0.1.4.tar.gz.
File metadata
- Download URL: ordered_str_enum-0.1.4.tar.gz
- Upload date:
- Size: 6.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7bb5ffcd11f80e8b5aa8a1e4a6b41eb6fb186df9d66553ef60f70ff80f06b42e
|
|
| MD5 |
bf86d2d5fc1005b76ce05210d0b6b9a9
|
|
| BLAKE2b-256 |
c445896742184d83ca8dcf9e05f96a76cb929cf52c0717cb645e2a9a0007a3e0
|
File details
Details for the file ordered_str_enum-0.1.4-py3-none-any.whl.
File metadata
- Download URL: ordered_str_enum-0.1.4-py3-none-any.whl
- Upload date:
- Size: 5.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f9df2fb04fa6836c69d29ebe444ddb7fb92d85560ff10edef3c1a03ed8f2e31
|
|
| MD5 |
fe407d8062f4a2ab6a17f0a56e29854c
|
|
| BLAKE2b-256 |
17c08dcb5df6285b948d042f2ba52bf59c02541ccfd175813c96eb9ba4b8acfa
|