質問

私の状況は次のとおりです。

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 は、名前付き引数の名前/値マッピングの辞書です。

また、 if frequency in frequency という行があまり意味をなさないため、グローバル frequency リストの名前を frequencies に変更しました。

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