【问题标题】:Python 3 isinstance bool without external validator or type()?Python 3 isinstance bool 没有外部验证器或类型()?
【发布时间】:2018-07-18 10:55:35
【问题描述】:

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

【问题讨论】:

    标签: python python-3.x boolean


    【解决方案1】:

    您在正确的轨道上观察到boolint 的子类。问题在于isinstance 的行为。来自documentation(已添加重点):

    isinstance对象,类信息

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

    由于boolint 的子类,因此传递给 if/elif 子句的任何布尔值都不会超过第一个 if 语句,isinstance(<bool>, int) 将返回 True。您需要在检查int 之前检查bool

    【讨论】:

      【解决方案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')
      

      【讨论】:

        猜你喜欢
        • 2013-12-26
        • 2013-03-25
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 2022-06-21
        • 2013-06-10
        • 2022-06-29
        • 2021-10-22
        相关资源
        最近更新 更多