将 python2 'file' class 的子 class 移植到 python3

Porting a sub-class of python2 'file' class to python3

我有一个遗留代码调用 class TiffFile(file)。 python3 的调用方式是什么?

我试图替换 python2 中的以下内容:

class TiffFile(file):
    def __init__(self, path):
        file.__init__(self, path, 'r+b')

通过这个在python3:

class TiffFile(RawIOBase):
    def __init__(self, path):
        super(TiffFile, self).__init__(path, 'r+b')

但现在我得到 TypeError: object.__init__() takes no parameters

RawIOBase.__init__ 不接受任何参数,这就是你的错误所在。

你的 TiffFile 实现也继承了 file 这不是一个 class,而是一个构造函数,所以你的 Python 2 实现是非惯用的,有人甚至可以声称这是错误的。您应该使用 open 而不是 file,并且在 class 上下文中您应该使用 io 模块 class 作为输入和输出。

您可以使用 open to return a file object for use as you would use file in Python 2.7 or you can use io.FileIO in both Python 2 and Python 3 来访问文件流,就像您使用 open 一样。

所以你的实现会更像是:

import io

class TiffFile(io.FileIO):
    def __init__(self, name, mode='r+b', *args, **kwargs):
        super(TiffFile, self).__init__(name, mode, *args, **kwargs)

这应该适用于所有当前支持的 Python 版本,并允许您使用与旧实现相同的界面,同时更加正确和可移植。

您实际上是在使用 r+b 在 Windows 上以读写二进制模式打开文件吗?如果您不写入文件,而只是读取 TIFF 数据,您可能应该使用 rb 模式。 rb 将以二进制模式打开文件以供只读。附加的 + 设置文件以读写模式打开。