EnumWithDict
is a Python package that extends the standard library's Enum class to include to_dict
, get_initial
, and other class methods. This enhancement allows for the straightforward conversion of enum classes to dictionaries, easy access to the initial enum value, and additional functionalities such as retrieving enum values with a fallback option, validating mappings, and more.
- to_dict: Convert an enum class to a dictionary representation, mapping member names to their values.
- get_initial: Retrieve the first value defined in the enum, useful for cases where a default or initial value is needed.
- get: Mimics the dictionary
get
method, allowing retrieval of enum values with an optional default fallback. Additionally, it supports an optional custom mapping dictionary for dynamically mapped value retrieval. - validate_mapping_keys: Ensure that a provided mapping includes all enum values, raising an error for any missing mappings.
- map: Map enum members to values based on the provided dictionary.
- keys: Retrieve the keys of the enum class as a list or as a KeysView.
- values: Retrieve the values of the enum class as a list or as a ValuesView.
Install EnumWithDict
using pip:
pip install enum-with-dict
from enum_with_dict import EnumWithDict
class Color(EnumWithDict):
RED = 'red'
GREEN = 'green'
BLUE = 'blue'
color_dict = Color.to_dict()
print(color_dict)
# Output: {'RED': 'red', 'GREEN': 'green', 'BLUE': 'blue'}
initial_color = Color.get_initial()
print(initial_color)
# Output: 'red'
Retrieve an enum value by its name, with an option to specify a default value if the name does not exist. Additionally, you can pass a custom mapping dictionary to retrieve a mapped value instead of the enum's default value.
print(Color.get('RED')) # Output: 'red'
print(Color.get('PURPLE', default='unknown')) # Output: 'unknown'
print(Color.get('PURPLE')) # Output: 'red'
You can also use a custom mapping dictionary to retrieve a value. This is useful when you need to map enum members to different values dynamically.
custom_mapping = {'RED': 'Rouge', 'GREEN': 'Vert', 'BLUE': 'Bleu'}
print(Color.get('RED', mapping=custom_mapping)) # Output: 'Rouge'
Validate that a provided mapping covers all enum members.
# Assuming a partial mapping for demonstration
partial_mapping = {'RED': 'Rouge', 'GREEN': 'Vert'}
try:
Color.validate_mapping_keys(partial_mapping)
except ValueError as e:
print(e)
# Expected output: Missing mappings for: BLUE
Map enum members to values using the provided dictionary.
This mapping operation does not alter the values within the Enum itself; instead, it generates a new dictionary with the same keys and updated values.
Internally, validate_mapping_keys
is invoked to confirm that the keys align with the Enum members, but the value types remain arbitrary.
💡 Helpful Hint: Using the
.map
method ensures that the mapping maintains the same keys as theEnum
members, allowing for a direct correspondence. This method validates that allEnum
members are accounted for in the mapping, preventing omissions or the inclusion of extraneous keys. It's a safeguard to ensure that your mapping is comprehensive and accurately reflects theEnum
structure.
# Define the key mapping
key_mapping = {
TestEnum.VALUE_1: "some_new_value",
TestEnum.VALUE_2: "another_new_value",
TestEnum.VALUE_3: "a new value"
}
# Perform the mapping and validate
mapped_values = TestEnum.map(key_mapping)
# ----- The above is equivalent to the following: -----
# Validate the mapped values
expected_values = {
TestEnum.VALUE_1.name: "some_new_value",
TestEnum.VALUE_2.name: "another_new_value",
TestEnum.VALUE_3.name: "a new value"
}
assert mapped_values == expected_values
Retrieve the keys and values of the enum class as a list or as a KeysView
or ValuesView
.
keys_list = Color.keys()
keys_view = Color.keys(as_list=False)
values_list = Color.values()
values_view = Color.values(as_list=False)
EnumWithDict
is released under the MIT License. See the LICENSE file for more details.