Skip to content

Enum Members and Values

Access and manipulate enum members and their values. Understand the differences between names, values, and member objects.


Accessing Names and Values

from enum import Enum

class Fruit(Enum):
    APPLE = "apple"
    BANANA = "banana"
    ORANGE = "orange"

# Get member object
apple = Fruit.APPLE
print(apple)              # Fruit.APPLE
print(type(apple))        # <enum 'Fruit'>

# Access name and value separately
print(apple.name)         # 'APPLE'
print(apple.value)        # 'apple'

# Both directions
print(Fruit['APPLE'])     # Fruit.APPLE
print(Fruit('apple'))     # Fruit.APPLE

Listing All Members

from enum import Enum

class Day(Enum):
    MONDAY = 1
    TUESDAY = 2
    WEDNESDAY = 3
    THURSDAY = 4
    FRIDAY = 5
    SATURDAY = 6
    SUNDAY = 7

# Access _member_names_ (tuple)
print(Day._member_names_)  # ('MONDAY', 'TUESDAY', ...)

# Access _member_map_ (dict name -> member)
print(Day._member_map_['FRIDAY'])  # Day.FRIDAY

# Access _value2member_map_ (dict value -> member)
print(Day._value2member_map_[5])   # Day.FRIDAY

# Iterate
for day in Day:
    print(f"{day.name}: {day.value}")

Creating Enums with Complex Values

from enum import Enum
from dataclasses import dataclass

@dataclass
class Config:
    code: str
    description: str

class ErrorType(Enum):
    NOT_FOUND = Config("404", "Resource not found")
    FORBIDDEN = Config("403", "Access denied")
    SERVER_ERROR = Config("500", "Internal server error")

error = ErrorType.NOT_FOUND
print(f"{error.value.code}: {error.value.description}")
# Output: 404: Resource not found

Alias Members

from enum import Enum

class Status(Enum):
    ACTIVE = 1
    INACTIVE = 2
    PENDING = 3
    # Aliases - multiple names for same value
    WAITING = 3
    ON_HOLD = 3

# Aliases are hidden in iteration
for status in Status:
    print(status)
# Output: Status.ACTIVE, Status.INACTIVE, Status.PENDING

# Access by alias
print(Status.WAITING)           # Status.PENDING (canonical member)
print(Status.WAITING.name)      # 'PENDING'
print(Status.WAITING == Status.PENDING)  # True

# Canonical and aliases have same object
print(Status.PENDING is Status.WAITING)  # True

Conditional Access

from enum import Enum

class PaymentMethod(Enum):
    CREDIT_CARD = "cc"
    DEBIT_CARD = "dc"
    BANK_TRANSFER = "bt"
    PAYPAL = "pp"
    CRYPTOCURRENCY = "crypto"

def get_fee_percentage(method: PaymentMethod) -> float:
    fee_map = {
        PaymentMethod.CREDIT_CARD: 2.9,
        PaymentMethod.DEBIT_CARD: 0.5,
        PaymentMethod.BANK_TRANSFER: 0.0,
        PaymentMethod.PAYPAL: 3.49,
        PaymentMethod.CRYPTOCURRENCY: 1.0
    }
    return fee_map.get(method, 0)

fee = get_fee_percentage(PaymentMethod.CREDIT_CARD)
print(f"Fee: {fee}%")

Serialization

from enum import Enum
import json

class Color(Enum):
    RED = "#FF0000"
    GREEN = "#00FF00"
    BLUE = "#0000FF"

# Serialize by value
color = Color.RED
json_str = json.dumps({'color': color.value})
print(json_str)  # {'color': '#FF0000'}

# Deserialize back
data = json.loads(json_str)
restored_color = Color(data['color'])
print(restored_color)  # Color.RED

Safe Member Access

from enum import Enum

class Status(Enum):
    PENDING = "pending"
    ACTIVE = "active"
    COMPLETED = "completed"

def safe_get_status(value: str) -> Status:
    try:
        return Status(value)
    except ValueError:
        return Status.PENDING  # Default

status = safe_get_status("unknown")
print(status)  # Status.PENDING