Генерация динамической временной дельты:питон
Вопрос
Вот моя ситуация:
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
Я хочу динамически определять временной интервал с помощью timedelta
, но, похоже, это не работает.
Есть ли какой-то конкретный способ заставить это работать?Я получаю здесь недопустимый синтаксис.
Есть ли какие-нибудь лучшие способы сделать это?
Решение
Вы можете вызвать функцию с динамическими аргументами, используя такой синтаксис, как func(**kwargs)
где kwargs
является словарем сопоставлений имени и значения для именованных аргументов.
Я также переименовал глобальный frequency
список для frequencies
с момента появления линии if frequency in frequency
в этом не было особого смысла.
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)
Как бы то ни было, стилистически обычно не одобряется молчаливое исправление ошибок, которые допускает вызывающий абонент.Если вызывающий вызывает вас с недопустимыми аргументами, вы, вероятно, должны немедленно и громко потерпеть неудачу, а не пытаться продолжать пыхтеть.Я бы не рекомендовал этого делать if
заявление.
Дополнительные сведения о списках аргументов переменной длины и ключевых слов см. в разделе:
Другие советы
Ваше использование print eval(...)
выглядит немного чрезмерно сложным (и неправильным, как вы упомянули).
Если вы хотите передать аргумент ключевого слова функции, просто сделайте это:
interval = datetime.timedelta(frequency = str(frequencyMultiple)
Я не вижу вызываемого аргумента ключевого слова frequency
хотя, так что это может быть отдельной проблемой.