Generare un delta temporale dinamico: python
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?
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.