使用isinstance比较boolean和int

时间:2016-06-17 18:59:41

标签: python int boolean comparison isinstance

在下列情况下,有人可以解释为什么isinstance()会返回True吗?在编写代码时,我期待False。

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

我的猜测是它的Python的内部子类,为零和一 - 无论是浮点数还是整数 - 都用作布尔值时进行求值,但不知道确切的原因。

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

5 个答案:

答案 0 :(得分:31)

由于历史原因,boolint的子类,因此Trueint的实例。 (最初,Python没有bool类型,返回真值的东西返回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.
    
  • 如果你想检测所有浮点数和整数,你就已经这样做了。

答案 1 :(得分:1)

是的,这是正确的,它是int的子类,您可以使用解释器验证它:

import csv
import psycopg2

try: 
    conn = psycopg2.connect("dbname='student', user='postgres',password='password', host='localhost'")
except:
    print "I am unable to connect to the database."
    cursor = conn.cursor()
try:
    reader = csv.reader(open('last_file.csv', 'rb'))
    print "connected"
except:
    print "not Connected"

答案 2 :(得分:1)

如果您只想查看int

if type(some_var) is int:
    return True

else:
    return False

答案 3 :(得分:0)

查看bool和int上python的某些行为(不太奇怪)

>>> 1 == True  
True           
>>> 0 == False 
True           
>>> True*5 == 0
False          
>>> True*5 == 5
True           
>>> 

它们可以互换使用...!

从boolobject.h(Win py 2.7)中,我可以看到bool obj的int类型定义。因此,很明显,布尔继承了int的一些面部特征。

#ifndef Py_BOOLOBJECT_H
#define Py_BOOLOBJECT_H
#ifdef __cplusplus
extern "C" {
#endif


typedef PyIntObject PyBoolObject;

答案 4 :(得分:0)

这是一个实例检查器,它对 bool 来说是安全的,并且像 isinstance() 一样采用单一类型或类型的元组

def isInst(o, of) -> bool:
    if o is None: return False
    cls = o.__class__
    if isinstance(of, type):
        return cls == of

    else:
        if cls == bool:
            return bool in of
        else:
            for i in range(len(of)):
                if cls == of[i]: return True

    return False