这是我的情况:

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