微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将Python2文件派生类移植到Python 3

如何解决将Python2文件派生类移植到Python 3

我正在移植一些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))

它的使用类似于File对象:

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,*args,**kwargs):
        super(myfile,self).__init__(name,closefd=True,**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,但是它需要一个打开的文件描述符,而且我担心其行为会有所不同。

谢谢!

解决方法

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

基本的实现思路是:

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

一种快速的解决方案是猴子修补:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。