【问题标题】:Porting a sub-class of python2 'file' class to python3将python2“文件”类的子类移植到python3
【发布时间】:2018-05-30 00:31:13
【问题描述】:

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

【问题讨论】:

  • 这个对象是如何使用的?您可能可以将其设为 函数,只调用 open()
  • 它用于返回具有一堆属性的对象。它可能可以工作,但整个代码是OO

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


【解决方案1】:

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

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

您可以使用 open 返回文件对象以供使用,就像在 Python 2.7 中使用 file 一样,也可以在 Python 2Python 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 将以二进制模式打开文件以进行只读。附加的+ 将文件设置为以读写模式打开。

【讨论】:

  • 我不确定 'r+b' 的含义,这是我想从 Python3 调用的旧代码。它确实会写回它打开的文件。
  • r 模式以读取方式打开文件,r+ 以读写方式打开文件,r+b 以读写方式打开文件,因此它以二进制方式读写。二进制模式适用于没有文本编码数据的图像、视频和音乐文件。通常最好打开文件一次读取它,然后将新数据写入另一个文件,以避免在读取文件时改变文件,这会产生非常难以调试的副作用。
  • 这个包按设计写回东西,因为文件很大。我暂时不会惹它
猜你喜欢
  • 2021-10-30
  • 2020-12-28
  • 1970-01-01
  • 2015-06-17
  • 2021-01-11
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多