我有一个函数可以在一个或多个指定日期(例如,第一天和第 15 天)执行每月任务。为了增强可用性,我想让用户只传递一个 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。我惊讶地发现使用“或”表达式并依靠短路不起作用 - 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,或者在布尔表达式短路之前,内部类型检查是否真的发生在整行代码上?这似乎很奇怪。
我的第二个问题是: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"
有什么明显的我忽略了吗?