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

时间:2017-12-15 19:00:55

标签: python-3.x python-2.7 porting python-2to3

我有一个调用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

1 个答案:

答案 0 :(得分:1)

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

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

您可以使用open返回文件对象,以便在Python 2.7中使用file,或者在Python 2和{{3}中使用io.FileIO用于访问文件流,就像使用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将以二进制模式打开文件以供阅读。附加的+将文件设置为以读写模式打开。