Генерация динамической дельты времени: python - PullRequest
2 голосов
/ 30 октября 2009

Вот моя ситуация:

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, но это не похоже на работу.

Есть какой-то конкретный способ заставить эту работу? Я получаю неверный синтаксис здесь.

Есть ли лучшие способы сделать это?

Ответы [ 2 ]

6 голосов
/ 30 октября 2009

Вы можете вызвать функцию с динамическими аргументами, используя синтаксис, такой как 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.

Для получения дополнительной информации о списках аргументов переменной длины и ключевых слов см .:

0 голосов
/ 30 октября 2009

Использование print eval(...) выглядит немного сложнее (и, как вы уже сказали, неправильно).

Если вы хотите передать аргумент ключевого слова в функцию, просто сделайте это:

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

Я не вижу ключевого аргумента с именем frequency, так что это может быть отдельной проблемой.

...