Python在短路布尔值之前会引发TypeErrors吗?

use*_*379 4 python typechecking short-circuiting

我有一个函数在一个或多个指定日期(例如,第一个和第15个)执行每月任务.为了增强可用性,我想让用户只需要传递一个int,当他们只希望它发生在一天月份,或每月多个事件的整数列表.

monthly_event(days_of_month=1, event="paycheck") 
monthly_event(days_of_month=[1,15], event="bills", starting=date(2013,1,1))
Run Code Online (Sandbox Code Playgroud)

在内部,函数将迭代列表并执行与单个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"
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是:我是否误解了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"
Run Code Online (Sandbox Code Playgroud)

有没有明显的东西我忽略了?

Gre*_*ill 6

我相信当问题发生时dt.day != days(并且没有采取短路),然后Python会尝试dt.day in days表达式,然后得到一个TypeError.