每次使用 datetime 计算时都计算 Pyton 枚举?

Calculate Pyton Enum each time when evaluated with datetime?

提问人:geckels1 提问时间:6/20/2023 更新时间:6/25/2023 访问量:118

问:

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

from enum import Enum
import datetime

class MyEnum(Enum):
    TODAY = datetime.datetime.now()
    TOMORROW = datetime.datetime.now() + datetime.timedelta(days=1)
python-3.x django datetime 枚举

评论

1赞 willeM_ Van Onsem 6/20/2023
是的,但主要问题是你是否真的想这样做,因为它需要一些元编程,而且可能不是一个好主意,但对于技术部分来说不是那么多,但更多的是因为这意味着一个人在数据库中设置,但当你访问属性的选择时,这将永远是那个特定的时间戳, 所以“永远不会来”:)TODAYTOMORROW
3赞 willeM_ Van Onsem 6/20/2023
这很可能是 X-Y 问题:你想做某事(名为 X),但你没有问 X,而是认为你会通过 Y 解决它,因此你问 Y,但 Y 可能不是解决它的最佳方法。那么,是否有可能解释一下您打算解决的问题
0赞 geckels1 6/20/2023
它用于运行自定义 SQL 查询。我想在今天、昨天、明天等运行它,这似乎是 Enum 的一个很好的用途。我知道我可以使用一个函数,这就是我目前正在做的事情,但我想我会问看看使用 Enum 是更简单还是更容易。听起来好像不是?
0赞 FObersteiner 6/20/2023
使用返回元组(今天,明天)的函数听起来不错。

答:

1赞 willeM_ Van Onsem 6/25/2023 #1

您可以通过对描述符进行编程来做到这一点,例如:

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)

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

评论

0赞 geckels1 6/25/2023
我坚持使用一个简单的函数,但我喜欢这两个答案!尤其是描述符,即使它确实破坏了大部分 Enum 函数。这些正是我一直在寻找的答案。