如何包装文件对象的读写操作(只读)?

2024-04-21

我试图包装文件对象实例的读写操作(特别是readline() and write()方法)。

通常,我会简单地用包装器替换这些函数,有点像这样:

def log(stream):
    def logwrite(write):
        def inner(data):
            print 'LOG: > '+data.replace('\r','<cr>').replace('\n','<lf>')
            return write(data)
        return inner
    stream.write = logwrite(stream.write)

但文件对象的属性是只读的!我怎样才能正确地包裹它们?

(注意:我懒得包装整个文件对象......真的,我不想错过一个我没有正确包装的功能,或者可能会在Python的未来版本中添加的功能)

更多背景:

我正在尝试自动与调制解调器进行通信,调制解调器的 AT 命令集可通过 telnet 会话在网络上使用。登录后,我将“抓取”我想要与之通信的模块。一段时间没有活动后,会发生超时,从而释放模块(以便网络上的其他用户可以使用它......我不在乎,我是该设备的唯一用户)。自动释放会在会话中写入特定行。

我想包裹readline()在从套接字构建的文件上(参见socket.makefile())这样当超时发生时,会抛出一个特定的异常,这样我就可以在脚本中的任何位置检测到超时并做出适当的反应,而不会使 AT 命令解析器复杂化...

(当然,我想这样做,因为超时是相当虚假的,否则我会简单地向调制解调器提供命令,而不会产生任何副作用,只是为了保持模块处于活动状态)

(随意提出任何其他方法或策略来实现此效果)


use __getattr__包装您的文件对象。为您关心的问题提供修改后的方法。

class Wrapped(object):
    def __init__(self, file_):
        self._file = file_

    def write(self, data):
        print 'LOG: > '+data.replace('\r','<cr>').replace('\n','<lf>')
        return self._file.write(data)

    def __getattr__(self, attr):
         return getattr(self._file, attr)

这样,对您未明确提供的属性的请求将被路由到包装对象上的属性,您可以只实现您想要的属性

logged = Wrapped(open(filename))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何包装文件对象的读写操作(只读)? 的相关文章

随机推荐