Question

Voici ma situation:

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

Je souhaite définir de manière dynamique un intervalle de temps avec timedelta , mais cela ne semble pas fonctionner.

Existe-t-il un moyen spécifique de faire ce travail? J'obtiens une syntaxe non valide ici.

Existe-t-il de meilleurs moyens de le faire?

Était-ce utile?

La solution

Vous pouvez appeler une fonction avec des arguments dynamiques en utilisant une syntaxe telle que func (** kwargs) kwargs est un dictionnaire de correspondances nom / valeur pour les arguments nommés.

J'ai également renommé la liste globale fréquence en fréquences car la ligne si la fréquence est n'a pas beaucoup de sens.

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)

Pour ce que cela vaut, stylistiquement, il est généralement mal vu de corriger en silence les erreurs commises par un appelant. Si l'appelant vous appelle avec des arguments non valides, vous devriez probablement échouer immédiatement et fort plutôt que d'essayer de continuer à chugger. Je recommanderais contre cette instruction if .

Pour plus d'informations sur les listes d'arguments de longueur variable et d'arguments de mots clés, voir:

Autres conseils

Votre utilisation de print eval (...) a l'air un peu compliquée (et fausse, comme vous l'avez mentionné).

Si vous souhaitez passer un argument de mot clé à une fonction, faites-le simplement:

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

Je ne vois cependant pas d'argument de mot clé appelé frequency . Il pourrait donc s'agir d'un problème distinct.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top