在下列情况下,有人可以解释为什么isinstance()
会返回True吗?在编写代码时,我期待False。
print isinstance(True, (float, int))
True
我的猜测是它的Python的内部子类,为零和一 - 无论是浮点数还是整数 - 都用作布尔值时进行求值,但不知道确切的原因。
解决这种情况最神经的方法是什么?我可以使用type()
,但在大多数情况下,这被认为不那么pythonic。
答案 0 :(得分:31)
由于历史原因,bool
是int
的子类,因此True
是int
的实例。 (最初,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
如果要检测特定类正好为float
或int
的对象,请拒绝子类,您可以这样做:
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