微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有查找/读取操作的 MyPy 类型错误

如何解决带有查找/读取操作的 MyPy 类型错误

我有一些使用 seek()/read() 的逻辑,它绝对有效,但是当我针对代码运行 MyPy 时会收到一些输入错误。我想弄清楚的是我可以做些什么来让 MyPy 理解这些类型。或者,更确切地说,我可以做些什么来使类型更符合 MyPy 的预期并且仍然有工作代码

我在 seek()read() 等方面查找了一系列资源,但没有发现任何内容可以为我提供有关如何处理这种情况的明确建议。

有问题的代码是这样的:

def read_format(self) -> None:
    self.data.seek(0,os.SEEK_SET)

    data_format = self.data.read(4)

    if data_format.decode("latin-1") == "FORM":
        self.data.seek(8,os.SEEK_SET)

    if self.data.read(4).decode("latin-1") == "IFRS":
        self._file_format = FORMAT.BLORB
    else:
        self._file_format = FORMAT.UNKNowN

对于上面的两个 seek() 调用,MyPy 是这样说的:

“IOBase”的“seek”参数1具有不兼容的类型“int”;预期的“IOBase”

对于上面的两个 read() 调用,MyPy 是这样说的:

“BufferedioBase”的“读取”参数 1 具有不兼容的类型“int”;预期的“BufferedioBase”

接下来要理解的是我如何定义 self.data。就是这样:

@property
def data(self) -> Type[BufferedReader]:
    """Binary data stream of the story file."""

    return self._file_data

被引用的 self._file_data__init__ 方法中:

def __init__(self,story_file: str):
    self._file_data = BufferedReader

我在 Python 中查找的关于 read() 函数的大多数示例都显示它的使用与我所拥有的完全一样。这同样适用于 seek() 函数。但很明显,这不是 MyPy 所期望的,我将基于 Python 代码的理想构建方式假设 MyPy 是相关的。

Tangent:我尝试将类型提示更改为:Type[BufferedioBase]。我这样做是因为这似乎是 MyPy 所期待的。我还尝试将变量初始化更改为:self._file_data = BufferedioBase。这没有效果,会出现相同的错误。我还得到了一个新的:"Type[BufferedioBase]" 没有属性 "name"。该错误来自我代码中的另一行 (assert self.data.name == self.path),并且之所以有效是因为 BufferedReader 具有 name 属性,而 BufferedioBase 没有。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。