2

これが私の状況です:

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が、これは機能しないようです。

これを機能させる特定の方法はありますか?ここで無効な構文を取得しています。

それを行うためのより良い方法はありますか?

4

2 に答える 2

7

名前付き引数の名前/値マッピングの辞書は次のようfunc(**kwargs)な構文を使用して、動的引数を使用して関数を呼び出すことができます。kwargs

また、この行があまり意味をなさなかったため、グローバルfrequencyリストの名前をに変更しました。frequenciesif 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 に答える