所以我试图通过一个列表并识别不同的int,float和bool。现在我知道在堆栈here的研究之后,根据最初的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
现在,有没有什么方法可以通过一些特殊处理打印出来,而不使用this之类的外部验证器或使用“type()==”? 感谢
答案 0 :(得分:2)
您在正确的轨道上观察bool
是int
的子类。问题是isinstance
的行为。从documentation(强调添加):
isinstance ( object,classinfo )
如果object参数是classinfo参数, 或其(直接,间接或虚拟)子类 的实例,则返回true。如果 object不是给定类型的对象,函数总是返回 假。如果classinfo是类型对象的元组(或递归,其他 这样的元组),如果object是任何一个的实例,则返回true 类型。如果classinfo不是类型和类型元组的类型或元组,则a 引发TypeError异常。
由于bool
是int
的子类,因此传入if / elif子句的任何bool都不会超过第一个if语句,isinstance(<bool>, int)
将返回True
。您需要在检查bool
之前检查int
。
答案 1 :(得分:2)
只需更改支票的顺序,先检查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')