2009-10-30 4 views
1

여기 내 상황입니다 : 나는 동적으로 timedelta와 시간 간격을 정의 할: 파이썬

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 

,하지만이 작동하지 않습니다.

이 작업을 수행 할 수있는 특별한 방법이 있습니까? 여기에 잘못된 구문이 나타납니다.

더 좋은 방법이 있습니까?

답변

4

func(**kwargs)과 같은 구문을 사용하여 동적 인수를 사용하여 함수를 호출 할 수 있습니다. kwargs은 명명 된 인수에 대한 이름/값 매핑 사전입니다.

또한 if frequency in frequency 행이 의미가 없기 때문에 frequencies으로 글로벌 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

+0

아, 고쳐 주셨습니다. =) – Blixt

+0

도움을 주셔서 감사합니다! –

0

print eval(...)의 사용은 보이는 약간의 오버 복잡 (그름 등 너는 언급한다).

당신이 함수에 키워드 인수를 전달하려면

단지 그것을 수행하는 별도의 문제가 될 수 있도록

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

나는 키워드 인수 그래도 frequency라고 볼 수 없습니다.