使用 isinstance 比较 boolean 和 int

新手上路,请多包涵

有人能给我解释为什么 isinstance() 在以下情况下返回 True 吗?在编写代码时,我预计会出现 False。

 print isinstance(True, (float, int))
True

我的猜测是它的 Python 的内部子类化,作为零和一 - 无论是 float 还是 int - 都在用作布尔值时进行评估,但不知道确切原因。

解决这种情况的最pythonic方法是什么?我可以使用 type() 但在大多数情况下,这被认为不那么 pythonic。

原文由 jake77 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 877
2 个回答

For historic reasons, bool is a subclass of int , so True is an instance of int . (最初,Python 没有 bool 类型,返回真值的东西返回 1 或 0。 当他们添加 bool 时,True 和 False 必须尽可能地替代 1 和 0向后兼容性,因此子类化。)

“解决”这个问题的正确方法完全取决于您认为问题是什么。

  • 如果你想要 True 不再是 int ,好吧,太糟糕了。那不会发生。
  • 如果你想检测布尔值并以不同于其他整数的方式处理它们,你可以这样做:
   if isinstance(whatever, bool):
      # special handling
  elif isinstance(whatever, (float, int)):
      # other handling

  • 如果你想检测其特定类恰好是 floatint 的对象,拒绝子类,你可以这样做:
   if type(whatever) in (float, int):
      # Do stuff.

  • 如果你想检测所有的浮点数和整数,你已经在这样做了。

原文由 user2357112 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以看到方法解析顺序,并从那里找到所有超类:

 >>> bool.__mro__
(<class 'bool'>, <class 'int'>, <class 'object'>)

原文由 Vicrobot 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题