У меня есть объект 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')
Это работает почти так, как ожидалось, но я должен yield from
каждый вызов read
и write
. Я пробовал yield from
ing изнутри Connection
:
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 from
каждый раз; сохраняя их внутри Connection
. Моя конечная цель - сократить мою функцию new_conection
:
@asyncio.coroutine
def new_conection(stream_in, stream_out):
conn = Connection(stream_in, stream_out)
print(conn.read(4))