All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Snow <jsnow@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel <qemu-devel@nongnu.org>,
	Peter Maydell <peter.maydell@linaro.org>,
	 Michael Roth <michael.roth@amd.com>
Subject: Re: [PATCH 08/19] qapi/schema: add static typing and assertions to lookup_type()
Date: Wed, 22 Nov 2023 10:55:36 -0500	[thread overview]
Message-ID: <CAFn=p-axjksRWSA1G0iXLJFJOXx8Xbry3K6nowmQqVOkgg=r_g@mail.gmail.com> (raw)
In-Reply-To: <874jheugz5.fsf@pond.sub.org>

On Wed, Nov 22, 2023 at 7:09 AM Markus Armbruster <armbru@redhat.com> wrote:
>
> John Snow <jsnow@redhat.com> writes:
>
> > On Tue, Nov 21, 2023, 9:21 AM Markus Armbruster <armbru@redhat.com> wrote:
> >
> >> John Snow <jsnow@redhat.com> writes:
> >>
> >> > This function is a bit hard to type as-is; mypy needs some assertions to
> >> > assist with the type narrowing.
> >> >
> >> > Signed-off-by: John Snow <jsnow@redhat.com>
> >> > ---
> >> >  scripts/qapi/schema.py | 8 ++++++--
> >> >  1 file changed, 6 insertions(+), 2 deletions(-)
> >> >
> >> > diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
> >> > index a1094283828..3308f334872 100644
> >> > --- a/scripts/qapi/schema.py
> >> > +++ b/scripts/qapi/schema.py
> >> > @@ -968,8 +968,12 @@ def lookup_entity(self, name, typ=None):
> >> >              return None
> >> >          return ent
> >> >
> >> > -    def lookup_type(self, name):
> >> > -        return self.lookup_entity(name, QAPISchemaType)
> >> > +    def lookup_type(self, name: str) -> Optional[QAPISchemaType]:
> >>
> >> Any particular reason not to delay the type hints until PATCH 16?
> >>
> >
> > I forget. In some cases I did things a little differently so that the type
> > checking would pass for each patch in the series, which sometimes required
> > some concessions.
> >
> > Is this one of those cases? Uh, I forget.
> >
> > If it isn't, its almost certainly the case that I just figured I'd type
> > this one function in one place instead of splitting it apart into two
> > patches.
> >
> > I can try to shift the typing later and see what happens if you prefer it
> > that way.
>
> Well, you structured the series as "minor code changes to prepare for
> type hints", followed by "add type hints".  So that's what I expect.
> When patches deviate from what I expect, I go "am I missing something?"
>
> Adding type hints along the way could work, too.  But let's try to stick
> to the plan, and add them all in PATCH 16.
>
> >> > +        typ = self.lookup_entity(name, QAPISchemaType)
> >> > +        if typ is None:
> >> > +            return None
> >> > +        assert isinstance(typ, QAPISchemaType)
> >> > +        return typ
> >>
> >> Would
> >>
> >>            typ = self.lookup_entity(name, QAPISchemaType)
> >>            assert isinstance(typ, Optional[QAPISchemaType])
> >>            return typ
> >>
> >> work?
> >>
> >
> > I don't *think* so, Optional isn't a runtime construct.
>
> Let me try...
>
>     $ python
>     Python 3.11.5 (main, Aug 28 2023, 00:00:00) [GCC 12.3.1 20230508 (Red Hat 12.3.1-1)] on linux
>     Type "help", "copyright", "credits" or "license" for more information.
>     >>> from typing import Optional
>     >>> x=None
>     >>> isinstance(x, Optional[str])
>     True
>     >>>

Huh. I ... huh!

Well, this apparently only works in Python 3.10!+

TypeError: Subscripted generics cannot be used with class and instance checks

>
> >                                                         We can combine it
> > into "assert x is None or isinstance(x, foo)" though - I believe that's
> > used elsewhere in the qapi generator.
>
> >> >
> >> >      def resolve_type(self, name, info, what):
> >> >          typ = self.lookup_type(name)
> >>
> >>
>



  reply	other threads:[~2023-11-22 15:56 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-16  1:43 [PATCH 00/19] qapi: statically type schema.py John Snow
2023-11-16  1:43 ` [PATCH 01/19] qapi/schema: fix QAPISchemaEntity.__repr__() John Snow
2023-11-16  7:01   ` Philippe Mathieu-Daudé
2023-11-16  1:43 ` [PATCH 02/19] qapi/schema: add pylint suppressions John Snow
2023-11-21 12:23   ` Markus Armbruster
2023-11-16  1:43 ` [PATCH 03/19] qapi/schema: name QAPISchemaInclude entities John Snow
2023-11-21 13:33   ` Markus Armbruster
2023-11-21 16:22     ` John Snow
2023-11-22  9:37       ` Markus Armbruster
2023-12-13  0:45         ` John Snow
2023-11-16  1:43 ` [PATCH 04/19] qapi/schema: declare type for QAPISchemaObjectTypeMember.type John Snow
2023-11-16  1:43 ` [PATCH 05/19] qapi/schema: make c_type() and json_type() abstract methods John Snow
2023-11-16  7:03   ` Philippe Mathieu-Daudé
2023-11-21 13:36   ` Markus Armbruster
2023-11-21 13:43     ` Daniel P. Berrangé
2023-11-21 16:28       ` John Snow
2023-11-21 16:34         ` Daniel P. Berrangé
2023-11-22  9:50           ` Markus Armbruster
2023-11-22  9:54             ` Daniel P. Berrangé
2023-11-16  1:43 ` [PATCH 06/19] qapi/schema: adjust type narrowing for mypy's benefit John Snow
2023-11-16  7:04   ` Philippe Mathieu-Daudé
2023-11-21 14:09   ` Markus Armbruster
2023-11-21 16:36     ` John Snow
2023-11-22 12:00       ` Markus Armbruster
2023-11-22 18:12         ` John Snow
2023-11-23 11:00           ` Markus Armbruster
2023-11-16  1:43 ` [PATCH 07/19] qapi/introspect: assert schema.lookup_type did not fail John Snow
2023-11-21 14:17   ` Markus Armbruster
2023-11-21 16:41     ` John Snow
2023-11-22  9:52       ` Markus Armbruster
2023-11-16  1:43 ` [PATCH 08/19] qapi/schema: add static typing and assertions to lookup_type() John Snow
2023-11-21 14:21   ` Markus Armbruster
2023-11-21 16:46     ` John Snow
2023-11-22 12:09       ` Markus Armbruster
2023-11-22 15:55         ` John Snow [this message]
2023-11-23 11:04           ` Markus Armbruster
2023-11-16  1:43 ` [PATCH 09/19] qapi/schema: assert info is present when necessary John Snow
2023-11-16  7:05   ` Philippe Mathieu-Daudé
2023-11-16  1:43 ` [PATCH 10/19] qapi/schema: make QAPISchemaArrayType.element_type non-Optional John Snow
2023-11-21 14:27   ` Markus Armbruster
2023-11-21 16:51     ` John Snow
2023-11-16  1:43 ` [PATCH 11/19] qapi/schema: fix QAPISchemaArrayType.check's call to resolve_type John Snow
2023-11-22 12:59   ` Markus Armbruster
2023-11-22 15:58     ` John Snow
2023-11-23 13:03       ` Markus Armbruster
2024-01-10 19:33         ` John Snow
2024-01-11  9:33           ` Markus Armbruster
2024-01-11 22:24             ` John Snow
2023-11-16  1:43 ` [PATCH 12/19] qapi/schema: split "checked" field into "checking" and "checked" John Snow
2023-11-22 14:02   ` Markus Armbruster
2024-01-10 20:21     ` John Snow
2024-01-11  9:24       ` Markus Armbruster
2023-11-16  1:43 ` [PATCH 13/19] qapi/schema: fix typing for QAPISchemaVariants.tag_member John Snow
2023-11-22 14:05   ` Markus Armbruster
2023-11-22 16:02     ` John Snow
2024-01-10  1:47       ` John Snow
2024-01-10  7:52         ` Markus Armbruster
2024-01-10  8:35           ` John Snow
2024-01-17  8:19             ` Markus Armbruster
2024-01-17 10:32               ` Markus Armbruster
2024-01-17 10:53                 ` Markus Armbruster
2024-02-01 20:54                   ` John Snow
2023-11-16  1:43 ` [PATCH 14/19] qapi/schema: assert QAPISchemaVariants are QAPISchemaObjectType John Snow
2023-11-23 13:51   ` Markus Armbruster
2024-01-10  0:42     ` John Snow
2023-11-16  1:43 ` [PATCH 15/19] qapi/parser: demote QAPIExpression to Dict[str, Any] John Snow
2023-11-23 14:12   ` Markus Armbruster
2024-01-10  0:14     ` John Snow
2024-01-10  7:58       ` Markus Armbruster
2023-11-16  1:43 ` [PATCH 16/19] qapi/schema: add type hints John Snow
2023-11-24 15:02   ` Markus Armbruster
2023-11-16  1:43 ` [PATCH 17/19] qapi/schema: turn on mypy strictness John Snow
2023-11-16  1:43 ` [PATCH 18/19] qapi/schema: remove unnecessary asserts John Snow
2023-11-28  9:22   ` Markus Armbruster
2023-11-16  1:43 ` [PATCH 19/19] qapi/schema: refactor entity lookup helpers John Snow
2023-11-28 12:06   ` Markus Armbruster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAFn=p-axjksRWSA1G0iXLJFJOXx8Xbry3K6nowmQqVOkgg=r_g@mail.gmail.com' \
    --to=jsnow@redhat.com \
    --cc=armbru@redhat.com \
    --cc=michael.roth@amd.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.