【问题标题】:Why does isinstance not recognize io.BytesIO as a subclass of io.IOBase?为什么 isinstance 不能将 io.BytesIO 识别为 io.IOBase 的子类?
【发布时间】:2020-07-17 11:56:24
【问题描述】:

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

我最近偶然发现了 pycharm 的类型提示的一种奇怪行为,这后来揭示了 python 本身的问题。我有一个采用流的方法,所以我将类型设置为io.BaseIO。但是,当我将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。

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

【问题讨论】:

  • 我投票结束这个问题作为How do I check (at runtime) if one class is a subclass of another?的副本
  • @mkrieger1 这个问题并不是真正的重复,但对除了我之外的任何人都没有用,因为这是我个人的愚蠢错误。我似乎找不到关闭我自己问题的按钮,但如果我应该删除它,我可以删除它

标签: python python-3.x oop


【解决方案1】:

那是因为

isinstance(io.BytesIO, io.IOBase)

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

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

【讨论】:

  • 天啊,你是对的。我太笨了)。所以这使它成为 pycharm 故障,但我想我可以忍受)
  • @abel1502 我认为原因是pycharm 不知道变量的类型,因为python 是一种动态语言,您可以使用注释让pycharm“认为”它是@987654324 @.或者你可以试试一个有用的插件,叫做Kite
  • @Kite,不,它确实知道类型 - 它说类似“BytesIO 通过了预期 IOBase 的位置”。 + 代码就像stream = io.BytesIO()\nself.write(stream)。但是重启 pycharm 实际上也解决了这个问题
猜你喜欢
  • 1970-01-01
  • 2017-05-09
  • 2018-03-01
  • 1970-01-01
  • 2014-10-28
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多