代码之家  ›  专栏  ›  技术社区  ›  jwodder

mypy声明IO[bytes]与BinaryIO不兼容

  •  1
  • jwodder  · 技术社区  · 4 年前

    考虑以下代码:

    from io      import TextIOWrapper
    from typing  import List
    from zipfile import ZipFile
    
    def read_zip_lines(zippath: str, filename: str) -> List[str]:
        with ZipFile(zippath) as zf:
            with zf.open(filename) as bfp:
                with TextIOWrapper(bfp, 'utf-8') as fp:
                    return fp.readlines()
    

    在Python 3.6.9下对上述代码运行mypy v0.782失败,错误如下:

    zfopen.py:8: error: Argument 1 to "TextIOWrapper" has incompatible type "IO[bytes]"; expected "BinaryIO"
    

    但是,我觉得这个代码不应该被视为一个错误,因为 ZipFile.open() TextIOWrapper IO[bytes] BinaryIO 声明为的子类 IO[字节] 到处都能接受 二进制 是的,只是子类不是这样工作的,我不知道在键入时如何正确地使用这个子类。

    • typeshed在声明的返回类型时出错 ZipFile.打开() IO[字节] 而不是 二进制 ?
    • 在向声明第一个参数的类型时出现typeshed错误 作为 二进制 IO[字节] ?
    • typing 二进制 一个子类 IO[字节]
    • 我的代码是不是因为没有执行某种类型的强制转换而出错了 bfp ?
    • 是不是我的想法错了 可以通过 文本包装器
    0 回复  |  直到 4 年前
        1
  •  5
  •   Jerry101    4 年前

    这个使用mypy 0.782的较短测试用例得到相同的错误:

        binary_file = io.open('foo.bin', 'rb')
        text_file = io.TextIOWrapper(binary_file, encoding='utf-8', newline='')
    

    是否 binary_file 显式声明为 IO[bytes] 或推断。

    使用 mypy 0.770 mypy 0.790

    这是mypy打字室的倒退( Issue 4349 )修正值是mypy 0.790,修正了两者 zipfile.open() io.open() .