2

Here's my situation:

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

I want to dynamically define a time interval with timedelta, but this does not seem to work.

Is there any specific way to make this work? I'm getting invalid syntax here.

Are there any better ways to do it?

4

2 回答 2

7

func(**kwargs)您可以使用语法如where kwargsis 命名参数的名称/值映射字典来调用具有动态参数的函数。

我还将全局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说法。

有关可变长度和关键字参数列表的更多信息,请参阅:

于 2009-10-30T13:26:05.240 回答
0

您的使用print eval(...)看起来有点过于复杂(正如您提到的那样是错误的)。

如果要将关键字参数传递给函数,只需执行以下操作:

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

我没有看到调用的关键字参数frequency,所以这可能是一个单独的问题。

于 2009-10-30T13:26:20.653 回答