django 每次使用datetime进行评估时是否计算Pyton枚举?

bt1cpqcv  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(70)

有没有一种方法可以在Python中创建一个Enum,每次访问Enum属性时计算值?具体来说,我尝试创建一个Enum类,它存储像TODAYTOMORROW等值。对于一个运行了很多天的Web应用程序(在Django中),我希望每次访问时都重新计算该值,以防日期发生变化。因此,假设应用程序在3月1日启动,如果应用程序在3月3日检查TODAY,它将返回3月3日,而不是3月1日,这是它初始化的目的。

from enum import Enum
import datetime

class MyEnum(Enum):
    TODAY = datetime.datetime.now()
    TOMORROW = datetime.datetime.now() + datetime.timedelta(days=1)
gijlo24d

gijlo24d1#

你可以通过编写一个描述符来做到这一点,比如:

from datetime import datetime, timedelta
from enum import Enum

class DtDiff:
    def __init__(self, delta=timedelta()):
        self.delta = delta

    def __get__(self, obj, objtype=None):
        return datetime.now() + self.delta

class MyEnum(Enum):
    TODAY = DtDiff()
    TOMORROW = DtDiff(timedelta(days=1))

但在这种情况下,这甚至会使枚举的大多数功能无效,因此这可能不是一个好主意。
也许更好的方法是在Enum上定义一个函数,比如:

from datetime import datetime, timedelta
from enum import Enum

class MyEnum(Enum):
    TODAY = timedelta(0)
    TOMORROW = timedelta(days=1)

    @property
    def timestamp(self):
        return datetime.now() + self.value

然后,您可以通过以下方式获取时间戳:

>>> MyEnum.TODAY.timestamp
datetime.datetime(2023, 6, 24, 19, 32, 41, 854253)

这看起来像是获取枚举选择的时间戳的最小工作量。

相关问题