On Tue, Apr 13, 2021 at 11:55:50AM -0400, John Snow wrote: > This is an abstraction that represents a single message either sent to > or received from the server. It is used to subclass the > AsyncProtocol(Generic[T]) type. > > It was written such that it can be populated by either raw data or by a > dict, with the other form being generated on-demand, as-needed. > > It behaves almost exactly like a dict, but has some extra methods and a > special constructor. (It should quack fairly convincingly.) > > Signed-off-by: John Snow > --- > message.py | 196 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 196 insertions(+) > create mode 100644 message.py > > diff --git a/message.py b/message.py > new file mode 100644 > index 0000000..5c7e828 > --- /dev/null > +++ b/message.py > @@ -0,0 +1,196 @@ > +""" > +QMP Message format and errors. > + > +This module provides the `Message` class, which represents a single QMP > +message sent to or from the server. Several error-classes that depend on > +knowing the format of this message are also included here. > +""" > + > +import json > +from json import JSONDecodeError > +from typing import ( > + Dict, > + ItemsView, > + Iterable, > + KeysView, > + Optional, > + Union, > + ValuesView, > +) > + > +from error import ( > + DeserializationError, > + ProtocolError, > + UnexpectedTypeError, > +) > + > + > +class Message: > + """ > + Represents a single QMP protocol message. > + > + QMP uses JSON objects as its basic communicative unit; so this > + object behaves like a MutableMapping. It may be instantiated from > + either another mapping (like a dict), or from raw bytes that still > + need to be deserialized. > + > + :param value: Initial value, if any. > + :param eager: When true, attempt to serialize (or deserialize) the > + initial value immediately, such that conversion exceptions > + are raised during the call to the initialization method. > + """ Why define this class instead of using dicts? It's a very fancy way of calling json.dumps() and json.loads().