Gerando um delta tempo dinâmico: python
Pergunta
Aqui está a minha situação:
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
Eu quero definir dinamicamente um intervalo de tempo com timedelta
, mas isso não parece trabalho.
Existe alguma maneira específica para fazer este trabalho? Estou ficando sintaxe inválida aqui.
Existem maneiras melhores de fazer isso?
Solução
Você pode chamar uma função com argumentos dinâmicos usando sintaxe como func(**kwargs)
onde kwargs
é dicionário de mapeamentos de nome / valor para os argumentos nomeados.
Eu também renomeou a lista frequency
global para frequencies
desde o if frequency in frequency
linha não fez um monte de sentido.
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)
Por que vale a pena, estilisticamente geralmente é desaprovado a erros silenciosamente corrigir um chamador faz. Se o chamador chama-lo com argumentos inválidos você provavelmente deve falhar imediatamente e em voz alta ao invés de tentar manter chugging. Eu recomendo contra essa declaração if
.
Para mais informações sobre de comprimento variável e listas de argumentos de palavra-chave, consulte:
Outras dicas
O uso do print eval(...)
parece um pouco mais complicada (e errado, como você menciona).
Se você quiser passar um argumento de palavra-chave para uma função, basta fazê-lo:
interval = datetime.timedelta(frequency = str(frequencyMultiple)
Eu não vejo um argumento palavra-chave chamada frequency
embora, de modo que pode ser um problema em separado.