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?