Flag and IntFlag¶
Flag and IntFlag are specialized enums for bit flags, supporting bitwise operations like OR, AND, and NOT.
Flag Basics¶
from enum import Flag, auto
class Permission(Flag):
READ = auto() # 1
WRITE = auto() # 2
EXECUTE = auto() # 4
# Single permission
user1_perms = Permission.READ
print(user1_perms) # Permission.READ
# Multiple permissions with bitwise OR
user2_perms = Permission.READ | Permission.WRITE
print(user2_perms) # Permission.READ|WRITE
# Check if permission is set
print(Permission.READ in user2_perms) # True
print(Permission.EXECUTE in user2_perms) # False
Practical Flag Example¶
from enum import Flag, auto
class FileMode(Flag):
READABLE = auto() # 1
WRITABLE = auto() # 2
EXECUTABLE = auto() # 4
def check_permissions(mode: FileMode, required: FileMode) -> bool:
return required in mode
file_mode = FileMode.READABLE | FileMode.WRITABLE
# Check single permission
print(check_permissions(file_mode, FileMode.READABLE)) # True
print(check_permissions(file_mode, FileMode.EXECUTABLE)) # False
# Check multiple permissions
can_read_write = FileMode.READABLE | FileMode.WRITABLE
print(can_read_write in file_mode) # True
IntFlag¶
from enum import IntFlag, auto
class Status(IntFlag):
RUNNING = auto() # 1
PAUSED = auto() # 2
STOPPED = auto() # 4
ERROR = auto() # 8
# IntFlag can also use arithmetic
status = Status.RUNNING | Status.ERROR
print(status) # Status.RUNNING|ERROR
print(status.value) # 9 (1 + 8)
# Can mix with integers
combined = status | 0x10 # Add raw bits
print(combined.value) # 25
# Bitwise operations work
print(status & Status.RUNNING) # Status.RUNNING
print(status & Status.PAUSED) # Status(0) - empty
Flag Iteration and Checking¶
from enum import Flag, auto
class Feature(Flag):
FEATURE_A = auto()
FEATURE_B = auto()
FEATURE_C = auto()
FEATURE_D = auto()
enabled_features = Feature.FEATURE_A | Feature.FEATURE_C
# Iterate over enabled features
print("Enabled features:")
for feature in Feature:
if feature in enabled_features:
print(f" - {feature.name}")
# Count enabled features
count = bin(enabled_features.value).count('1')
print(f"Total enabled: {count}")
Combining Flags¶
from enum import Flag, auto
class DatabaseOption(Flag):
CACHE = auto() # 1
REPLICATE = auto() # 2
COMPRESS = auto() # 4
ENCRYPT = auto() # 8
VALIDATE = auto() # 16
def create_connection(options: DatabaseOption):
if DatabaseOption.ENCRYPT in options:
print("Enabling encryption")
if DatabaseOption.CACHE in options:
print("Enabling cache")
if DatabaseOption.REPLICATE in options:
print("Enabling replication")
# Create options combination
conn_options = (DatabaseOption.ENCRYPT |
DatabaseOption.CACHE |
DatabaseOption.REPLICATE)
create_connection(conn_options)
Removing Flags¶
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
DELETE = auto()
ADMIN = auto()
# Start with multiple permissions
perms = Permission.READ | Permission.WRITE | Permission.DELETE
# Remove a permission
perms = perms & ~Permission.DELETE # Bitwise NOT and AND
print(perms) # Permission.READ|WRITE
# Check it's gone
print(Permission.DELETE in perms) # False
IntFlag Arithmetic¶
from enum import IntFlag, auto
class Level(IntFlag):
BASIC = auto() # 1
INTERMEDIATE = auto() # 2
ADVANCED = auto() # 4
level = Level.INTERMEDIATE
print(level.value) # 2
# IntFlag supports arithmetic
next_level = level | Level.ADVANCED
print(next_level.value) # 6
# Can extract individual flags
remaining = next_level & ~Level.INTERMEDIATE
print(remaining) # Level.ADVANCED
When to Use Flag¶
- Permissions and capabilities
- Feature toggles
- Configuration options
- Combination of boolean settings
- Need bitwise operations