我试图包装文件对象实例的读写操作(特别是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(使用前将#替换为@)