Enum Mate - Comprehensive Usage Guide

The enum_mate library enhances Python’s standard enum module with explicit APIs for validation and retrieval. It provides safer, more intuitive enum handling with comprehensive validation methods.

One of the key advantages of enum_mate is its intuitive and self-explanatory API naming convention. The library uses human-friendly method and attribute names that clearly convey their purpose. This means you can leverage your IDE’s auto-complete functionality to discover and use the available APIs without having to constantly refer to the documentation or memorize the exact syntax.

Import

[1]:
from enum_mate.api import BetterIntEnum, BetterStrEnum

BetterIntEnum - Enhanced Integer Enums

class BetterIntEnum: is an more advanced version of class YourEnumClass(int, enum.Enum):.

Basic Usage

[2]:
class StatusCode(BetterIntEnum):
    SUCCESS = 200
    NOT_FOUND = 404
    SERVER_ERROR = 500
    TIMEOUT = -1

Standard Enum Operations

[3]:
# Works exactly like standard int enums
StatusCode.SUCCESS == 200
[3]:
True
[4]:
StatusCode.SUCCESS + 1
[4]:
201
[5]:
StatusCode.SUCCESS > StatusCode.NOT_FOUND
[5]:
False
[6]:
{StatusCode.SUCCESS, StatusCode.NOT_FOUND} == {200, 404}
[6]:
True
[7]:
# String representation
print(StatusCode.SUCCESS)                 # StatusCode.SUCCESS
StatusCode.SUCCESS
[8]:
StatusCode.SUCCESS.name
[8]:
'SUCCESS'
[9]:
StatusCode.SUCCESS.value
[9]:
200

Enhanced API Methods

1. Retrieval by Name

[10]:
member = StatusCode.get_by_name("SUCCESS")
member
[10]:
<StatusCode.SUCCESS: 200>
[11]:
member is StatusCode.SUCCESS
[11]:
True
[12]:
try:
    StatusCode.get_by_name("INVALID")
except KeyError as e:
    print(e)
"Invalid `class __main__.StatusCode` member name: 'INVALID'"

2. Retrieval by Value

[13]:
member = StatusCode.get_by_value(200)
print(member)
StatusCode.SUCCESS
[14]:
member is StatusCode.SUCCESS
[14]:
True
[15]:
try:
    StatusCode.get_by_value(999)
except ValueError as e:
    print(e)
999 is not a valid StatusCode

3. Name Validation

[16]:
# Check if name is valid
StatusCode.is_valid_name("SUCCESS")
[16]:
True
[17]:
StatusCode.is_valid_name("success") # case-sensitive
[17]:
False
[18]:
StatusCode.is_valid_name("INVALID")
[18]:
False
[19]:
StatusCode.is_valid_name(200) # wrong type
[19]:
False

4. Value Validation

[20]:
# Check if value is valid
StatusCode.is_valid_value(200)
[20]:
True
[21]:
StatusCode.is_valid_value(-1) # negative values work
[21]:
True
[22]:
StatusCode.is_valid_value(999)
[22]:
False
[23]:
StatusCode.is_valid_value("200") # wrong type
[23]:
False

5. Value Validation with Exceptions

[24]:
# Validate and raise exception if invalid
StatusCode.ensure_is_valid_value(200) # No exception
[25]:
try:
    StatusCode.ensure_is_valid_value(999)
except ValueError as e: # Invalid StatusCode: 999
    print(e)
Invalid `class __main__.StatusCode`: 999

6. Type Conversion and Validation

[26]:
# Convert to int with validation
StatusCode.ensure_int(200) # 200 (int)
[26]:
200
[27]:
StatusCode.ensure_int(StatusCode.SUCCESS)
[27]:
200
[28]:
# Error handling
try:
    StatusCode.ensure_int(999)
except ValueError as e:
    print(e)
999 is not a valid StatusCode

7. Get All Names and Values

[29]:
# Get all enum names
StatusCode.get_names()
[29]:
['SUCCESS', 'NOT_FOUND', 'SERVER_ERROR', 'TIMEOUT']
[30]:
# Get all enum values
StatusCode.get_values()
[30]:
[200, 404, 500, -1]

BetterStrEnum - Enhanced String Enums

Basic Usage

[31]:
class Environment(BetterStrEnum):
    DEVELOPMENT = "dev"
    STAGING = "staging"
    PRODUCTION = "prod"
    TEST = "test"

Standard String Operations

[32]:
# Works exactly like standard str enums
Environment.DEVELOPMENT == "dev"
[32]:
True
[33]:
Environment.DEVELOPMENT.upper()
[33]:
'DEV'
[34]:
f"Running in {Environment.PRODUCTION}"
[34]:
'Running in Environment.PRODUCTION'
[35]:
{"dev", "prod"} & {Environment.DEVELOPMENT, Environment.PRODUCTION} # {'dev', 'prod'}
[35]:
{<Environment.DEVELOPMENT: 'dev'>, <Environment.PRODUCTION: 'prod'>}
[36]:
Environment.DEVELOPMENT.replace("v", "velopment")
[36]:
'development'

Enhanced API Methods

1. Retrieval by Name

[37]:
# Get enum member by name
member = Environment.get_by_name("DEVELOPMENT")
member
[37]:
<Environment.DEVELOPMENT: 'dev'>
[38]:
member is Environment.DEVELOPMENT
[38]:
True
[39]:
id(Environment.DEVELOPMENT)
[39]:
4429131728
[40]:
# Error handling
try:
    Environment.get_by_name("dev") # Wrong - this is the value, not name
except KeyError as e:
    print(repr(e))
KeyError("Invalid `class __main__.Environment` member name: 'dev'")

2. Retrieval by Value

[41]:
# Get enum member by value
member = Environment.get_by_value("dev")
member
[41]:
<Environment.DEVELOPMENT: 'dev'>
[42]:
member is Environment.DEVELOPMENT
[42]:
True
[43]:
# Error handling
try:
    Environment.get_by_value("DEVELOPMENT") # Wrong - this is the name, not value
except ValueError as e:
    print(repr(e))
ValueError("'DEVELOPMENT' is not a valid Environment")

3. Name Validation

[44]:
# Check if name is valid
Environment.is_valid_name("DEVELOPMENT")
[44]:
True
[45]:
Environment.is_valid_name("dev") # this is a value, not name
[45]:
False
[46]:
Environment.is_valid_name("INVALID")
[46]:
False

4. Value Validation

[47]:
Environment.is_valid_value("dev")
[47]:
True
[48]:
Environment.is_valid_value("DEVELOPMENT") # this is a name, not value
[48]:
False
[49]:
Environment.is_valid_value("invalid")
[49]:
False
[50]:
Environment.is_valid_value("")
[50]:
False

5. Value Validation with Exceptions

[51]:
# Validate and raise exception if invalid
Environment.ensure_is_valid_value("dev") # No exception
[52]:
try:
    Environment.ensure_is_valid_value("invalid")
except ValueError as e:
    print(repr(e))
ValueError("Invalid `class __main__.Environment`: 'invalid'")

6. Type Conversion and Validation

[53]:
# Convert to str with validation
Environment.ensure_str("dev")
[53]:
'dev'
[54]:
Environment.ensure_str(Environment.DEVELOPMENT)
[54]:
'dev'
[55]:
# Error handling
try:
    Environment.ensure_str("invalid")
except ValueError as e:
    print(repr(e))
ValueError("'invalid' is not a valid Environment")

7. Get All Names and Values

[56]:
# Get all enum names
Environment.get_names()
[56]:
['DEVELOPMENT', 'STAGING', 'PRODUCTION', 'TEST']
[57]:
# Get all enum values
Environment.get_values()
[57]:
['dev', 'staging', 'prod', 'test']

Advanced Usage Examples

Input Validation in Functions

[58]:
def process_request(status_code: int):
    """Process request based on status code."""
    # Validate input and convert to enum
    code = StatusCode.ensure_int(status_code)

    if code == StatusCode.SUCCESS:
        return "Request processed successfully"
    elif code == StatusCode.NOT_FOUND:
        return "Resource not found"
    else:
        return "Request failed"
[59]:
# Usage
process_request(200) # Request processed successfully
[59]:
'Request processed successfully'
[60]:
process_request(404) # Resource not found
[60]:
'Resource not found'
[61]:
try:
    process_request(999)
except ValueError as e:
    print(repr(e)) # Invalid status code: 999
ValueError('999 is not a valid StatusCode')

Configuration Management

[62]:
def get_database_config(env_name):
    """Get database configuration for environment."""
    # Ensure valid environment
    env = Environment.ensure_str(env_name)

    configs = {
        Environment.DEVELOPMENT: "localhost:5432",
        Environment.STAGING: "staging-db:5432",
        Environment.PRODUCTION: "prod-db:5432",
        Environment.TEST: "test-db:5432"
    }

    return configs[env]
[63]:
# Usage
get_database_config("dev")
[63]:
'localhost:5432'
[64]:
get_database_config("prod")
[64]:
'prod-db:5432'

Summary

The enum_mate library provides:

  • Explicit APIs for getting enum members by name or value

  • Built-in validation methods for safe enum handling

  • Type conversion utilities with validation

  • Comprehensive error handling with clear error messages

  • Full compatibility with standard Python enum operations

  • IDE-friendly method names for better development experience

Use BetterIntEnum for integer-based enums and BetterStrEnum for string-based enums to get enhanced functionality while maintaining all standard enum capabilities.

[ ]: