模式在扭曲的Python
问题描述:
在扭曲Python从传输读取,数据被写入到一个协议的传输,但通过覆盖dataReceived方法接收。是否有从交通工具读书的模式?使用inlineCallbacks
模式在扭曲的Python
例如执行状态时,这将是有益的:
class SomeProtocol(Protocol):
@defer.inlineCallbacks
def login(self):
self.transport.write('login')
resp = yield self.transport.read(5, timeout=1) # this doesn't exist
if resp != 'user:':
raise SomeException()
self.transport.write('admin')
resp = transport.read(9, timeout=1)
if resp != 'password:':
raise SomeException()
self.transport.write('hunter2')
# ... etc
答
已经有在实施的API这样一个多年来几次尝试。没有任何牵引。我认为他们现在都被抛弃了。
原则,这并不难实现。您只需将dataReceived回调(推式API)转换为拉式API即可。
在实践中,所产生的代码是脆弱的,而且往往包含更多的bug。
我想你想解决的问题是,dataReceived
是一个非常低级的原始解析的字节流。
有许多的这种可能的解决方案。你可以尝试构建一个更高层的基于协议的工具,它知道你的协议的各个方面(这基本上是Twisted中的所有协议实现的原理)。你也可以看看这样的第三方库,如tubes(它提供了一个不同的抽象来处理字节流)。
答
我结束了维持deferreds列表回调的数据到达,并缓冲输入数据,直到它满足第一个列表中的递延所需数据的长度。
它目前需要计数为非零。将它扩展为支持返回当前在读取缓冲区中的任何内容,以及使用超时但不计数的方式读取,以便返回超时后缓冲区中的内容。