Générer un delta temporel dynamique: python
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 ??code>, 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?
La solution
Vous pouvez appeler une fonction avec des arguments dynamiques en utilisant une syntaxe telle que func (** kwargs)
où 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.