生成动态时间差:python

2 投票
2 回答
3093 浏览
提问于 2025-04-15 15:31

这是我的情况:

import foo, bar, etc

frequency = ["hours","days","weeks"]

class geoProcessClass():

    def __init__(self,geoTaskHandler,startDate,frequency,frequencyMultiple=1,*args):
        self.interval = self.__determineTimeDelta(frequency,frequencyMultiple)

    def __determineTimeDelta(self,frequency,frequencyMultiple):
        if frequency in frequency:
            interval = datetime.timedelta(print eval(frequency + "=" + str(frequencyMultiple)))
            return interval
        else:
            interval = datetime.timedelta("days=1")
            return interval

我想用 timedelta 动态定义一个时间间隔,但这似乎不太管用。

有没有什么特别的方法可以让它正常工作?我在这里遇到了无效的语法错误。

有没有更好的方法来实现这个?

2 个回答

0

你用的 print eval(...) 看起来有点复杂(而且你提到的,可能也是错的)。

如果你想给一个函数传递一个关键字参数,直接这么做就行:

interval = datetime.timedelta(frequency = str(frequencyMultiple)

不过我没有看到叫 frequency 的关键字参数,所以这可能是另一个问题。

8

你可以用像 func(**kwargs) 这样的写法来调用一个函数,其中 kwargs 是一个字典,里面存放着参数的名字和对应的值。

我还把全局的 frequency 列表改名为 frequencies,因为那行代码 if frequency in frequency 听起来有点奇怪。

class geoProcessClass():
    def __init__(self, geoTaskHandler, startDate, frequency, frequencyMultiple=1, *args):
        self.interval = self.determineTimeDelta(frequency, frequencyMultiple)

    def determineTimeDelta(self, frequency, frequencyMultiple):
        frequencies = ["hours", "days", "weeks"]

        if frequency in frequencies:
            kwargs = {frequency: frequencyMultiple}
        else:
            kwargs = {"days": 1}

        return datetime.timedelta(**kwargs)

顺便说一下,通常来说,默默地纠正调用者的错误是不太被赞成的。如果调用者给你传了无效的参数,你应该立即并且明确地报错,而不是继续执行。我建议不要使用那个 if 语句。

想了解更多关于可变长度和关键字参数列表的信息,可以查看:

撰写回答