有人可以给我一个解释,为什么isinstance()在以下情况下返回True?编写代码时,我期望为False。
isinstance()
print isinstance(True, (float, int)) True
我的猜测是,它的Python内部子类为零和一(无论是float还是int)都在用作布尔值时进行评估,但不知道确切的原因。
解决这种情况的最有效方法是什么?我可以使用,type()但在大多数情况下,这被认为不那么pythonic。
type()
由于历史原因,bool是的子类int,所以True是的实例int。(最初,Python没有布尔类型,返回真值的东西返回1或0。添加它们时bool,必须将True和False尽可能多地替换为1和0,以实现向后兼容性,因此是子类。 )
bool
int
True
解决此问题的正确方法取决于您所认为的问题所在。
如果要检测布尔值并以不同于其他int的方式处理它们,则可以执行以下操作:
if isinstance(whatever, bool): # special handling
elif isinstance(whatever, (float, int)): # other handling
如果要检测其特定类恰好是float或int,拒绝子类的对象,则可以执行以下操作:
float
if type(whatever) in (float, int): # Do stuff.
如果要检测所有浮点数和整数,则已经在执行此操作。