【问题标题】:Porting Python2 file derived class to Python 3将 Python2 文件派生类移植到 Python 3
【发布时间】:2020-12-28 02:09:12
【问题描述】:

我正在移植一些 Python 2 遗留代码并且我有这个类:

class myfile(file):
    "Wrapper for file object whose read member returns a string buffer"
    def __init__ (self, *args):
        return file.__init__ (self, *args)

    def read(self, size=-1):
        return create_string_buffer(file.read(self, size))

它像一个文件对象一样使用:

self._file = myfile(name, mode, buffering)
self._file.seek(self.si*self.blocksize)

我正在尝试像这样在 Python 3 中实现它:

class myfile(io.FileIO):
    "Wrapper for file object whose read member returns a string buffer"
    def __init__(self, name, mode, *args, **kwargs):
        super(myfile, self).__init__(name, mode, closefd=True, *args, **kwargs)

    def read(self, size=-1):
        return create_string_buffer(self.read(size))

问题在于 FileIO 的构造函数没有采用 buffering 参数,Python 会抛出 TypeError: fileio() takes at most 3 arguments (4 given) 错误。

Python 3 open function 是我需要的。我可以继承吗?我查看了PyFile_FromFd class,但它需要一个打开的文件描述符,我担心行为会不一样。

谢谢!!!

【问题讨论】:

  • 您确定不再需要该课程吗? create_string_buffer 是做什么的?

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


【解决方案1】:

您不能从open 继承。缓冲参数改变了返回的类,所以open 被实现为一个可以返回多个类之一的函数。最好的选择是做同样的事情,如有必要,使用您自己的包装类。

基本实现思路是:

  1. myfile 是一个签名类似于open 的函数
  2. 您有两个类,一个继承自 FileIO,一个继承自 BufferedReader
  3. myfile 被调用时,它会检查buffering 参数,并创建并返回FileIO 派生子类(当无缓冲时)或使用open 创建一个普通的无缓冲FileIO 类,然后包装它在您的 BufferedReader 派生子类中。

【讨论】:

    【解决方案2】:

    一个快速的解决方案是猴子补丁:

    def myfile(*args, **kwargs):
        f = open(*args, **kwargs)
    
        def read(size=-1):
            return create_string_buffer(f._read(size))
    
        f._read = f.read # save old read method
        f.read = read # patch
    
        return f
    

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 2021-01-11
      相关资源
      最近更新 更多