繁体   English   中英

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

[英]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()==”? 谢谢

您在正确的位置上观察到boolint的子类。 问题是isinstance的行为。 文档 (添加重点):

isinstanceobject,classinfo

如果object参数是classinfo参数或其(直接,间接或虚拟)子类的实例,则返回true。 如果object不是给定类型的对象,则该函数始终返回false。 如果classinfo是类型对象的元组(或递归,其他类似的元组),则如果object是任何类型的实例,则返回true。 如果classinfo不是类型或此类的元组,则引发TypeError异常。

由于boolint的子类,因此传递给您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM