2016-06-17 19 views
4

有人可以给我一个解释为什么isinstance()在下面的情况下返回True?我在编写代码时预计会出现False。Python使用isinstance比较布尔值和int

print isinstance(True, (float, int)) 
True 

我的猜测是,它的蟒蛇的内部子类,因为零和一 - wheter float或INT - 布尔使用时既评估,但不知道确切的原因。

什么是解决这种情况的最pythonic方法?我可以使用type(),但在大多数情况下,这被认为是较不pythonic。

回答

13

由于历史原因,boolint子类,因此Trueint一个实例。 (原来,Python没有布尔型,并且返回真值的东西返回1或者0。When they added bool,True和False必须尽可能地为1和0直接替换,以便向后兼容,因此是子类)。

“解决”这个问题的正确方法取决于您认为问题是什么。

  • 如果你想True停止作为一个int,好了,太糟糕了。这不会发生。
  • 如果要检测布尔和其他整数不同的方式处理它们,你可以这样做:

    if isinstance(whatever, bool): 
        # special handling 
    elif isinstance(whatever, (float, int)): 
        # other handling 
    
  • 如果要检测对象,它们的具体类是完全floatint,拒绝子类,你可以做到这一点:

    if type(whatever) in (float, int): 
        # Do stuff. 
    
  • 如果你想检测所有的浮点数和整数,你已经这样做了。
+0

这是第二种情况。这意味着必须考虑这些内置类型的比较顺序 - 可以理解的是继承,但对于python来说却很不寻常。 – jake77

0

是的,这是正确的,它是为int的一个子类,你可以使用翻译验证:

>>> int.__subclasses__() 
[<type 'bool'>] 
0

如果你只是想检查int

if type(some_var) is int: 
    return True 

else: 
    return False