2009-10-30 42 views
1

这里是我的情况:生成一个动态的时间差:蟒蛇

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的时间间隔,但这似乎并没有工作。

是否有任何具体的方法使这项工作?我在这里得到无效的语法。

有没有更好的方法来做到这一点?

回答

4

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

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

+0

对于关键字参数解决方案+1。不过,它应该是'kwargs = {'days':1}''。 – Blixt 2009-10-30 13:30:39

+0

啊,你修好了,没关系=) – Blixt 2009-10-30 13:31:16

+0

谢谢你的帮助! – 2009-10-30 13:53:05

0

您使用的print eval(...)看起来有点过于复杂(和错误的,因为你提到)。

如果你想一个关键字参数传递给一个函数,只要做到这一点:

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

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