这是我的情况:
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
动态定义时间间隔,但这似乎不起作用。
是否有任何具体方法可以使这项工作?我在这里得到了无效的语法。
有没有更好的方法呢?
答案 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
的关键字参数,因此这可能是一个单独的问题。