首页 > 解决方案 > 为什么 isinstance 不能将 io.BytesIO 识别为 io.IOBase 的子类?

问题描述

编辑:这是我的错。正如@kevin-mayo 的回答中所建议的那样,我应该使用issubclass而不是。isinstance然后一切正常。

我最近偶然发现了 pycharm 类型提示的一种奇怪行为,这后来揭示了 python 本身的问题。我有一个采用流的方法,所以我将类型设置为io.BaseIO. 但是,当我将 a 传递BytesIO给它时,它给了我一个警告。我检查了以下内容:

>>> io.BytesIO.__mro__
(<class '_io.BytesIO'>, <class '_io._BufferedIOBase'>, <class '_io._IOBase'>, <class 'object'>)
>>> isinstance(io.BytesIO, io.IOBase)
False

这与 Python 文档所说的相矛盾,所以我真的很困惑。

我正在使用 Python 3.7。

我意识到这样做的鸭子打字方式,但请记住,我不是在进行严格的类型检查,而是进行方便的类型提示。

标签: pythonpython-3.xoop

解决方案


那是因为

isinstance(io.BytesIO, io.IOBase)

就是检查是否是类的实例,

您可能需要使用issubclass(io.BytesIO, io.IOBase)来检查它们


推荐阅读