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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top