生成动态时间增量: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
, ,但这似乎不起作用。
有什么具体方法可以使这项工作有效吗?我在这里得到无效语法。
还有更好的方法吗?
解决方案
您可以使用以下语法调用带有动态参数的函数 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
陈述。
有关可变长度和关键字参数列表的更多信息,请参阅:
其他提示
您使用print eval(...)
的看起来有点过于复杂(和错误的,因为你提到)。
如果您希望将关键字参数传递给一个函数,只要做到这一点:
interval = datetime.timedelta(frequency = str(frequencyMultiple)
我没有看到一个名为frequency
虽然关键字参数,所以这可能是一个单独的问题。
不隶属于 StackOverflow