動的な時間差の生成:python
質問
私の状況は次のとおりです。
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
というキーワード引数が表示されないため、別の問題になる可能性があります。
所属していません StackOverflow