【问题标题】:Generating a dynamic time delta: python生成动态时间增量:python
【发布时间】:2025-12-09 00:50:02
【问题描述】:

这是我的情况:

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动态定义一个时间间隔,但这似乎不起作用。

有什么具体的方法可以使这项工作吗?我在这里得到了无效的语法。

有没有更好的方法?

【问题讨论】:

    标签: python datetime eval timedelta


    【解决方案1】:

    您可以使用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 用于关键字参数解决方案。不过应该是kwargs = {'days': 1}
    • 我看到了错误类型(缺少 str 定界符,但这很好)你们知道我在哪里可以获得在函数中使用 **kwargs 的参考吗? *args 表示需要的参数数量,对吗?和 **kwars 是指带有值的变量字典?
    • __init__"days")中为frequency添加一个默认值,就可以省去麻烦的quash-error-silently检查了。
    【解决方案2】:

    您对print eval(...) 的使用看起来有点过于复杂(而且是错误的,正如您所提到的)。

    如果您想将关键字参数传递给函数,只需这样做:

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

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

    【讨论】: