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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top