Генерация динамической временной дельты:питон

StackOverflow https://stackoverflow.com/questions/1649753

Вопрос

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

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 хотя, так что это может быть отдельной проблемой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top