Generando un delta de tiempo dinámico: python
Pregunta
Aquí está mi situación:
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
Quiero definir dinámicamente un intervalo de tiempo con timedelta
, pero parece que esto no funciona.
¿Hay alguna forma específica de hacer que esto funcione? Aquí obtengo una sintaxis no válida.
¿Hay alguna forma mejor de hacerlo?
Solución
Puede llamar a una función con argumentos dinámicos utilizando una sintaxis como func (** kwargs)
donde kwargs
es un diccionario de asignaciones de nombre / valor para los argumentos nombrados.
También cambié el nombre de la lista global de frecuencia
a frecuencias
ya que la línea si la frecuencia en frecuencia
no tenía mucho 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 lo que vale, estilísticamente generalmente está mal visto corregir silenciosamente los errores que comete una persona que llama. Si la persona que llama lo llama con argumentos no válidos, probablemente debería fallar de inmediato y en voz alta en lugar de tratar de seguir molestando. Recomiendo contra esa declaración if
.
Para obtener más información sobre listas de argumentos de longitud variable y palabras clave, consulte:
Otros consejos
Su uso de print eval (...)
parece un poco demasiado complicado (e incorrecto, como usted menciona).
Si desea pasar un argumento de palabra clave a una función, simplemente hágalo:
interval = datetime.timedelta(frequency = str(frequencyMultiple)
Sin embargo, no veo un argumento de palabra clave llamado frecuencia
, por lo que podría ser un problema separado.