生成动态时间delta:python

时间:2009-10-30 13:12:31

标签: python datetime eval timedelta

这是我的情况:

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 :(得分:6)

您可以使用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声明。

有关可变长度和关键字参数列表的更多信息,请参阅:

答案 1 :(得分:0)

你对print eval(...)的使用看起来有点过于复杂(如你所说,这是错误的。)

如果要将关键字参数传递给函数,只需执行以下操作:

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

我没有看到名为frequency的关键字参数,因此这可能是一个单独的问题。