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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top