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

Dim*_*iev 5 porting python-2to3 python-2.7 python-3.x

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

我尝试在 python2 中替换以下内容:

class TiffFile(file):
    def __init__(self, path):
        file.__init__(self, path, 'r+b')
Run Code Online (Sandbox Code Playgroud)

在python3中是这样的:

class TiffFile(RawIOBase):
    def __init__(self, path):
        super(TiffFile, self).__init__(path, 'r+b')
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*kli 5

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

您的TiffFile实现还继承了file一个构造函数,而不是一个类,因此您的 Python 2 实现是不惯用的,有人甚至可能声称它是错误的。您应该使用open而不是file,并且在类上下文中您应该使用io模块类进行输入和输出。

您可以使用返回一个文件对象来使用,就像在 Python 2.7 中open使用一样,也可以在Python 2Python 3中使用来访问文件流,就像使用.fileio.FileIOopen

所以你的实现会更像是:

import io

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

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

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