生成动态时间差:python
这是我的情况:
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
语句。
想了解更多关于可变长度和关键字参数列表的信息,可以查看: