Erzeugen eines dynamischen Zeit Delta: python
Frage
Hier ist meine 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
Ich mag dynamisch ein Zeitintervall mit timedelta
definieren, aber das scheint nicht zu funktionieren.
Gibt es eine bestimmte Art und Weise, diese Arbeit zu machen? Ich erhalte eine ungültige Syntax hier.
Gibt es bessere Möglichkeiten, es zu tun?
Lösung
Sie können eine Funktion mit dynamischen Argumenten nennen wie func(**kwargs)
mit Syntax wo kwargs
Wörterbuch von Namen / Wert-Mappings für die genannten Argumente ist.
I umbenannt auch die globale frequency
Liste frequencies
da die Linie if frequency in frequency
nicht eine ganze Menge Sinn machte.
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)
Für das, was es wert ist, stilistisch ist es in der Regel verpönt zu leise Korrektur von Fehlern ein Anrufer macht. Wenn der Anrufer Sie mit ungültigen Argumenten aufruft sollten Sie wahrscheinlich sofort und laut scheitern, anstatt versuchen tuckern zu halten. Ich würde empfehlen, gegen diese if
Aussage.
Weitere Informationen über die mit variabler Länge und Keyword-Argument-Listen finden Sie unter:
Andere Tipps
Ihre Nutzung von print eval(...)
sieht ein bisschen zu kompliziert (und falsch, wie Sie erwähnen).
Wenn Sie ein Schlüsselwort-Argument an eine Funktion zu übergeben wollen, tun Sie es einfach:
interval = datetime.timedelta(frequency = str(frequencyMultiple)
Ich sehe nicht ein Schlüsselwort Argument genannt frequency
obwohl, so dass ein separates Problem sein könnte.