[英]Add Enum attributes dynamically
首先,我知道 Python 中的枚舉是不可變的。
我正在嘗試獲取一個枚舉,該枚舉具有每個月作為屬性以及其他枚舉值,例如:
class SalesFilter(str, enum.Enum):
this_month = 'this_month'
last_month = 'last_month'
this_year = 'this_year'
last_year = 'last_year'
jan = 'jan'
feb = 'feb'
mar = 'mar'
apr = 'apr'
may = 'may'
jun = 'jun'
jul = 'jul'
aug = 'aug'
sep = 'sep'
oct = 'oct'
nov = 'nov'
dec = 'dec'
我想知道是否有辦法動態生成這些月份,我想做類似的事情:
import calendar
months = [m.lower() for m in list(calendar.month_abbr)[1:]]
class SalesFilter(str, enum.Enum):
this_month = 'this_month'
last_month = 'last_month'
this_year = 'this_year'
last_year = 'last_year'
for m in months:
setattr(SalesFilter, f'{m}', m)
有沒有辦法做到這一點? 也許有元類,但我不知道從哪里開始。
最 Pythonic 的方式是使用功能 API 。
import calendar
from enum import Enum
# Any iterator of (name, value) pairs. Dictionary is one possible example.
months = {}
for m in list(calendar.month_abbr)[1:]:
months[m.lower()] = m.lower()
members = {
'this_month': 'this_month',
'last_month': 'last_month',
}
# Enum Members, maps Names and Values.
members.update(months)
# The Logic for mix-in.
class SalesLogic:
def __init__(self, month): # Several values per member are possible.
self.month = month
# Functional API, joins Logic with Members.
SalesFilter = Enum(
'SalesFilter',
members,
module='your_module',
qualname='your_module.SalesFilter',
type=SalesLogic)
# Tests.
print(type(SalesFilter), type(SalesFilter.apr), SalesFilter.apr.name, SalesFilter.apr.value)
# <class 'enum.EnumMeta'> <enum 'SalesFilter'> apr apr
x = SalesFilter.jan # Test suggested in comments.
if x == SalesFilter.jan and x.value == SalesFilter.jan.value and x.month == 'jan' and x.name == 'jan':
print('True') # The 4 tests are True.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.