aboutsummaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorJohn Snow <jsnow@redhat.com>2020-07-10 01:22:09 -0400
committerPhilippe Mathieu-Daudé <philmd@redhat.com>2020-07-14 22:22:22 +0200
commit2e2d93051753067fc5b888fdc18831127a4a900e (patch)
tree7d1270e3e77b8ce582e9adf37f61fdf2c4239c77 /python
parentef5d474472426eda6abf8128cdb1d026af94862b (diff)
python/qmp.py: add casts to JSON deserialization
mypy and python type hints are not powerful enough to properly describe JSON messages in Python 3.6. The best we can do, generally, is describe them as Dict[str, Any]. Add casts to coerce this type for static analysis; but do NOT enforce this type at runtime in any way. Note: Python 3.8 adds a TypedDict construct which allows for the description of more arbitrary Dictionary shapes. There is a third-party module, "Pydantic", which is compatible with 3.6 that can be used instead of the JSON library that parses JSON messages to fully-typed Python objects, and may be preferable in some cases. (That is well beyond the scope of this commit or series.) Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20200710052220.3306-6-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Diffstat (limited to 'python')
-rw-r--r--python/qemu/qmp.py8
1 files changed, 6 insertions, 2 deletions
diff --git a/python/qemu/qmp.py b/python/qemu/qmp.py
index ef3c919b76..1ae36050a4 100644
--- a/python/qemu/qmp.py
+++ b/python/qemu/qmp.py
@@ -13,6 +13,7 @@ import socket
import logging
from typing import (
Any,
+ cast,
Dict,
Optional,
TextIO,
@@ -130,7 +131,10 @@ class QEMUMonitorProtocol:
data = self.__sockfile.readline()
if not data:
return None
- resp = json.loads(data)
+ # By definition, any JSON received from QMP is a QMPMessage,
+ # and we are asserting only at static analysis time that it
+ # has a particular shape.
+ resp: QMPMessage = json.loads(data)
if 'event' in resp:
self.logger.debug("<<< %s", resp)
self.__events.append(resp)
@@ -262,7 +266,7 @@ class QEMUMonitorProtocol:
ret = self.cmd(cmd, kwds)
if 'error' in ret:
raise QMPResponseError(ret)
- return ret['return']
+ return cast(QMPReturnValue, ret['return'])
def pull_event(self, wait=False):
"""