使用 isinstance 比较 boolean 和 int

Comparing boolean and int using isinstance(使用 isinstance 比较 boolean 和 int)
本文介绍了使用 isinstance 比较 boolean 和 int的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

有人能给我解释一下为什么 isinstance() 在以下情况下返回 True 吗?在编写代码时,我期望 False.

Can someone give me an explanation why isinstance() returns True in the following case? I expected False, when writing the code.

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

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

My guess would be that its Python's internal subclassing, as zero and one - whether float or int - both evaluate when used as boolean, but don't know the exact reason.

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

What would be the most pythonic way to solve such a situation? I could use type() but in most cases this is considered less pythonic.

推荐答案

由于历史原因,boolint 的子类,所以 Trueint 的一个实例.(最初,Python 没有 bool 类型,返回真值的东西返回 1 或 0.当他们添加 bool 时,True 和 False 必须尽可能地替换 1 和 0 以实现向后兼容性,因此是子类化.)

For historic reasons, bool is a subclass of int, so True is an instance of int. (Originally, Python had no bool type, and things that returned truth values returned 1 or 0. When they added bool, True and False had to be drop-in replacements for 1 and 0 as much as possible for backward compatibility, hence the subclassing.)

解决"这个问题的正确方法取决于您认为问题是什么.

The correct way to "solve" this depends on exactly what you consider the problem to be.

  • 如果你想让 True 不再是 int,那太糟糕了.这不会发生.
  • 如果您想检测布尔值并以不同于其他整数的方式处理它们,您可以这样做:

  • If you want True to stop being an int, well, too bad. That's not going to happen.
  • If you want to detect booleans and handle them differently from other ints, you can do that:

if isinstance(whatever, bool):
    # special handling
elif isinstance(whatever, (float, int)):
    # other handling

  • 如果你想检测特定类正好是floatint的对象,拒绝子类,你可以这样做:

  • If you want to detect objects whose specific class is exactly float or int, rejecting subclasses, you can do that:

    if type(whatever) in (float, int):
        # Do stuff.
    

  • 如果您想检测所有浮点数和整数,您已经在这样做了.
  • 这篇关于使用 isinstance 比较 boolean 和 int的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

    本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

    相关文档推荐

    build conda package from local python package(从本地 python 包构建 conda 包)
    How can I see all packages that depend on a certain package with PIP?(如何使用 PIP 查看依赖于某个包的所有包?)
    How to organize multiple python files into a single module without it behaving like a package?(如何将多个 python 文件组织到一个模块中而不像一个包一样?)
    Check if requirements are up to date(检查要求是否是最新的)
    How to upload new versions of project to PyPI with twine?(如何使用 twine 将新版本的项目上传到 PyPI?)
    Why #egg=foo when pip-installing from git repo(为什么从 git repo 进行 pip 安装时 #egg=foo)