gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:41:57 25 4
gpt4 key购买 nike

我正在尝试包装文件对象实例的读写操作(特别是 readline()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 命令集可通过远程登录 session 在网络上使用。登录后,我将“获取”我想与之通信的模块。一段时间没有事件后,会发生超时并释放模块(以便网络上的其他用户可以使用它……我不在乎,我是该设备的唯一用户)。自动发布在 session 中写入特定行。

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

(当然,我想这样做是因为超时是虚假的,否则我会简单地向调制解调器提供没有任何副作用的命令,只是为了让模块保持事件状态)

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

最佳答案

使用 __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))

关于python - 如何包装文件对象的读写操作(只读)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4013843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com