【发布时间】:2018-02-04 14:23:19
【问题描述】:
我有一个Connection 对象,用于包含asyncio 连接的读写流:
class Connection(object):
def __init__(self, stream_in, stream_out):
object.__init__(self)
self.__in = stream_in
self.__out = stream_out
def read(self, n_bytes : int = -1):
return self.__in.read(n_bytes)
def write(self, bytes_ : bytes):
self.__out.write(bytes_)
yield from self.__out.drain()
在服务器端,connected 每次客户端连接时都会创建一个Connection 对象,然后读取 4 个字节。
@asyncio.coroutine
def new_conection(stream_in, stream_out):
conn = Connection(stream_in, stream_out)
data = yield from conn.read(4)
print(data)
在客户端,4个字节被写入。
@asyncio.coroutine
def client(loop):
...
conn = Connection(stream_in, stream_out)
yield from conn.write(b'test')
这几乎可以按预期工作,但我必须在每次 read 和 write 通话时拨打 yield from。我从Connection 内部尝试过yield froming:
def read(self, n_bytes : int = -1):
data = yield from self.__in.read(n_bytes)
return data
但我得到的不是数据,而是类似的输出
<generator object StreamReader.read at 0x1109983b8>
如果我从多个地方调用read 和write,我宁愿不要每次都重复yield froms;而是将它们留在Connection 内。我的最终目标是将我的new_conection 函数缩减为:
@asyncio.coroutine
def new_conection(stream_in, stream_out):
conn = Connection(stream_in, stream_out)
print(conn.read(4))
【问题讨论】:
-
为什么要让步?如果你不从 conn.read(4) 中产生,在我看来它只是返回一个字节对象。这就是您要在这里寻找的东西吗?
-
@RageCage:没有
yield froming,conn.read(4)仍然返回一个生成器:<generator object Connection.read at 0x1019262b0> -
对不起,我应该澄清一下;如果你没有从 conn.read() 的第一次迭代(单行版本)中产生什么结果?
-
@RageCage:如果你的意思是
def read(self, n_bytes): return self.__in.read(n_bytes)与data = conn.read(4)结合使用,我仍然需要一个生成器 (Connection.read)。 -
听起来我缺少一些上下文。 StreamReader.read 函数应该返回一个常规字节数组,因此如果您从不在读取工作流的任何地方使用 yield 关键字,则永远不应该生成生成器。
标签: python python-3.x generator python-asyncio yield-from