Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the correct way to yield from a stream?

Tags:

People also ask

How does yield work in Python?

Yield is a keyword in Python that is used to return from a function without destroying the states of its local variable and when the function is called, the execution starts from the last yield statement. Any function that contains a yield keyword is termed a generator. Hence, yield is what makes a generator.

What does a generator return in Python?

Simply speaking, a generator is a function that returns an object (iterator) which we can iterate over (one value at a time).

What is a generator object?

A generator is a special type of function which does not return a single value, instead, it returns an iterator object with a sequence of values. In a generator function, a yield statement is used rather than a return statement. The following is a simple generator function. Example: Generator Function.

What is the use of generator in Python?

Python Generator functions allow you to declare a function that behaves likes an iterator, allowing programmers to make an iterator in a fast, easy, and clean way. An iterator is an object that can be iterated or looped upon. It is used to abstract a container of data to make it behave like an iterable object.


I have a Connection object that is used to contain the read and write streams of asyncio connections:

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() 

On the server side, connected creates a Connection object every time a client connects, then reads 4 bytes.

@asyncio.coroutine def new_conection(stream_in, stream_out):     conn = Connection(stream_in, stream_out)     data = yield from conn.read(4)     print(data) 

And on the client side, 4 bytes are written out.

@asyncio.coroutine def client(loop):     ...     conn = Connection(stream_in, stream_out)     yield from conn.write(b'test') 

This works almost as expected, but I have to yield from every read and write call. I've tried yield froming from inside Connection:

def read(self, n_bytes : int = -1):     data = yield from self.__in.read(n_bytes)     return data 

But rather than getting data, I get an output like

<generator object StreamReader.read at 0x1109983b8> 

If I call read and write from multiple places, I would prefer not to repeat the yield froms every time; rather keeping them inside Connection. My ultimate goal is cut down my new_conection function to this:

@asyncio.coroutine def new_conection(stream_in, stream_out):     conn = Connection(stream_in, stream_out)     print(conn.read(4))