簡體   English   中英

動態添加枚舉屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM