Domanda

Ecco la mia situazione:

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

Voglio definire dinamicamente un intervallo di tempo con timedelta , ma questo non sembra funzionare.

Esiste un modo specifico per farlo funzionare? Sto ottenendo una sintassi non valida qui.

Esistono modi migliori per farlo?

È stato utile?

Soluzione

Puoi chiamare una funzione con argomenti dinamici usando una sintassi come func (** kwargs) dove kwargs è il dizionario delle mappature nome / valore per gli argomenti nominati.

Ho anche rinominato l'elenco globale frequenza in frequenze poiché la riga se la frequenza in frequenza non aveva molto senso.

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)

Per quello che vale, stilisticamente è di solito malvisto da errori silenziosi che un chiamante fa. Se il chiamante ti chiama con argomenti non validi, probabilmente dovresti fallire immediatamente e ad alta voce piuttosto che provare a continuare a soffocare. Lo sconsigliai con quell'istruzione if .

Per ulteriori informazioni sugli elenchi di argomenti a lunghezza variabile e parole chiave, consultare:

Altri suggerimenti

L'uso di print eval (...) sembra un po 'troppo complicato (e sbagliato, come dici tu).

Se vuoi passare un argomento di parola chiave a una funzione, fallo semplicemente:

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

Non vedo un argomento di parole chiave chiamato frequency , quindi potrebbe essere un problema separato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top