4

毎月のタスクを 1 日以上の指定日 (例: 1 日と 15 日) に実行する関数があります。使いやすさを向上させるために、ユーザーが 1 日だけ実行したい場合に単一の int を渡せるようにしたいと考えています。月、または月ごとの複数のイベントの int のリスト。

monthly_event(days_of_month=1, event="paycheck") 
monthly_event(days_of_month=[1,15], event="bills", starting=date(2013,1,1))

内部的には、関数はリストを反復処理し、単一の int に対して行うのと同じことを行います。

「int」はイテラブルではないため、ユーザーが単一の int を渡すだけで TypeError が発生しないようにする必要があります。「or」式を使用してショートサーキットに頼ってもうまくいかないことに驚きました - TypeError は依然として発生します。次に例を示します。

from datetime import date as date
dt = date.today()
days = 1
#days = [1,2]
if dt.day == days or dt.day in days:
    print "GOOD"
else:
    print "BAD"

私の最初の質問は、Python を誤解したのでしょうか、それともブール式の短絡の前にコード行全体で内部型チェックが実際に行われるのでしょうか? それは非常に奇妙に思えます。

私の2番目の質問は、これを行うPythonicの方法は何ですか? 「days」変数に対して明示的な型チェックを行うことは避けたいと思います。代わりに try/catch を使用すると、コードが肥大化します。

try:
    if dt.day == days:
        print "GOOD"
    else:
        print "BAD"
except TypeError:
    if dt.day in days:
        print "GOOD"
    else:
        print "BAD"

私が見落としている明らかな何かがありますか?

4

1 に答える 1

6

問題が発生するのはdt.day != days(そして短絡が取られなかった場合)、Pythonがdt.day in days式を試行し、TypeError.

于 2012-06-23T22:05:00.970 に答える