2009-10-30 56 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的,所以這可能是一個單獨的問題。