On 4/27/21 2:13 AM, Markus Armbruster wrote:
John Snow <js...@redhat.com> writes:

On 4/25/21 3:27 AM, Markus Armbruster wrote:
John Snow <js...@redhat.com> writes:

The single quote token implies the value is a string. Assert this to be
the case.

Signed-off-by: John Snow <js...@redhat.com>
---
   scripts/qapi/parser.py | 2 ++
   1 file changed, 2 insertions(+)

diff --git a/scripts/qapi/parser.py b/scripts/qapi/parser.py
index 6b443b1247e..8d1fe0ddda5 100644
--- a/scripts/qapi/parser.py
+++ b/scripts/qapi/parser.py
@@ -246,6 +246,8 @@ def get_members(self):
               raise QAPIParseError(self, "expected string or '}'")
           while True:
               key = self.val
+            assert isinstance(key, str)  # Guaranteed by tok == "'"
+
               self.accept()
               if self.tok != ':':
                   raise QAPIParseError(self, "expected ':'")

The assertion is correct, but I wonder why mypy needs it.  Can you help?


The lexer value can also be True/False (Maybe None? I forget) based on

Yes, None for tokens like '{'.

the Token returned. Here, since the token was the single quote, we know
that value must be a string.

Mypy has no insight into the correlation between the Token itself and
the token value, because that relationship is not expressed via the type
system.

I understand that mypy can't prove implications like if self.tok == "'",
then self.val is a str.

What I'm curious about is why key needs to be known to be str here.
Hmm, is it so return expr type-checks once you add -> OrderedDict[str,
object] to the function?


Oh, yes.


Reply via email to