Python 3 isinstance bool没有外部验证器或type()?

时间:2018-02-08 01:02:47

标签: python python-3.x boolean

所以我试图通过一个列表并识别不同的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()==”? 感谢

2 个答案:

答案 0 :(得分:2)

您在正确的轨道上观察boolint的子类。问题是isinstance的行为。从documentation(强调添加):

  

isinstance object,classinfo

     

如果object参数是classinfo参数, 或其(直接,间接或虚拟)子类 的实例,则返回true。如果   object不是给定类型的对象,函数总是返回   假。如果classinfo是类型对象的元组(或递归,其他   这样的元组),如果object是任何一个的实例,则返回true   类型。如果classinfo不是类型和类型元组的类型或元组,则a   引发TypeError异常。

由于boolint的子类,因此传入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')