[英]Python 3 isinstance bool without external validator or type()?
所以我试图通过一个列表,并确定不同的int,float和bool。 现在,从这里的堆栈中进行研究后,我知道按照最初的Python版本,bool是int的子类,并且我需要一些特殊的处理才能从int识别出bool,如下所示:
listone = ['232.54',False,'656',27.3,'5',' ',True,'-434','76.67','8.45','s',23]
for i in listone:
if isinstance(i,int):
print(i,'INT')
elif isinstance(i,float):
print(i,'FLOAT')
elif isinstance(i,str):
print(i,'STR')
elif isinstance(i,bool):
#SPECIAL HANDLING
print(i,'BOOL')
但是即使这样做,我仍然可以得到打印输出:
232.54 STR
False INT
656 STR
27.3 FLOAT
5 STR
STR
True INT
-434 STR
76.67 STR
8.45 STR
s STR
23 INT
现在,有什么方法可以通过一些特殊处理将其打印出来,而无需使用像这样的外部验证器或通过使用“ type()==”? 谢谢
您在正确的位置上观察到bool
是int
的子类。 问题是isinstance
的行为。 从文档 (添加重点):
isinstance ( object,classinfo )
如果object参数是classinfo参数或其(直接,间接或虚拟)子类的实例,则返回true。 如果object不是给定类型的对象,则该函数始终返回false。 如果classinfo是类型对象的元组(或递归,其他类似的元组),则如果object是任何类型的实例,则返回true。 如果classinfo不是类型或此类的元组,则引发TypeError异常。
由于bool
是int
的子类,因此传递给您的if / elif子句的任何bool
都不会使其超出第一个if语句,因此isinstance(<bool>, int)
会返回True
。 您需要将bool
支票放在int
支票之前。
只需更改检查顺序即可先检查bool
。 这样,它就不会被您的int
支票所抓住。
listone = ['232.54',False,'656',27.3,'5',' ',True,'-434','76.67','8.45','s',23]
for i in listone:
if isinstance(i, bool):
#SPECIAL HANDLING
print(i, 'BOOL')
elif isinstance(i, int):
print(i, 'INT')
elif isinstance(i, float):
print(i, 'FLOAT')
elif isinstance(i, str):
print(i, 'STR')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.