实现一个自定义的open函数/'subclass'open函数

问题描述

免责声明:标题中的 subclass 一词不正确,但这是对仅适用于pytho2的旧解决方案的引用,我不知道有什么更好的描述方式。

目标: 我正在寻找一种方法,可以让我按照现有代码进行操作

  • 文件的开头导入MyFile
  • “只需”将open替换为MyFile
  • open(*args,*kwargs)替换为MyFile(*args,*kwargs,special_param=True)

代码应像以前一样完全,但是在文件打开时(打开之前或之后)以及调用某些方法(例如,之前的close())时会触发一些其他行为或关闭后)

与我之前所说的完全一样,如果我将全局open(替换为MyFile((当然还要添加{{1 }}

MyFile不是类,因此不能被子类化。但是,仅python2的旧版本是通过 subclassing open实现的(这也不是AFAIK类,但是该解决方案有效)

仅适用于python2的旧解决方案:

file

使用它的方式是:

class MyFile(file):
    def __init__(self,fname,mode,special_param=False):
        # next line would be nice,but is not essential
        # do_something_special_before_opening(self,special_param)
        super(MyFile,self).__init__(fname,mode)
        do_something_special_after_opening(self,special_param)
    
    def close(self):
        super(MyFile,self).close()
        do_something_special_after_closing(self)

from mymodule import MyFile
# and then use MyFile in the rest of the file

由于from mymodule import MyFile as open # keep the rest of the file unchanged 在python中不再存在。

关于SO(Porting a sub-class of python2 'file' class to python3)已有答案 但是这不能回答我的问题,因为它建议从file继承,因为它希望写入io.FileIO而不是bytes

python3中实现这种功能的最佳方法是什么(适用于Linux和Windows)

python3中,str的结果并不总是属于同一类。

示例: 如果以文本模式打开,则返回open()对象。如果以二进制写模式打开,则返回_io.TextIOWrapper_io.BufferedWriter。如果使用_io.BufferedReader以二进制模式打开,则返回buffering=0

因此,一种选择可能是子类_io.FileIO_io.TextIOWrapper_io.BufferedWriter_io.BufferedReader,...并创建一个返回这些子类之一的工厂。

但是我想知道是否还有一种更优雅的方式。通过上述方法,我不得不创建一些子类并重新实现open的整个逻辑,从而确定用于哪种参数组合的类。

也许猴子修补有一些技巧?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)