qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 13/19] qapi/schema: fix typing for QAPISchemaVariants.tag_mem


From: John Snow
Subject: Re: [PATCH 13/19] qapi/schema: fix typing for QAPISchemaVariants.tag_member
Date: Tue, 9 Jan 2024 20:47:24 -0500

On Wed, Nov 22, 2023 at 11:02 AM John Snow <jsnow@redhat.com> wrote:
>
> On Wed, Nov 22, 2023 at 9:05 AM Markus Armbruster <armbru@redhat.com> wrote:
> >
> > John Snow <jsnow@redhat.com> writes:
> >
> > > There are two related changes here:
> > >
> > > (1) We need to perform type narrowing for resolving the type of
> > >     tag_member during check(), and
> > >
> > > (2) tag_member is a delayed initialization field, but we can hide it
> > >     behind a property that raises an Exception if it's called too
> > >     early. This simplifies the typing in quite a few places and avoids
> > >     needing to assert that the "tag_member is not None" at a dozen
> > >     callsites, which can be confusing and suggest the wrong thing to a
> > >     drive-by contributor.
> > >
> > > Signed-off-by: John Snow <jsnow@redhat.com>
> >
> > Without looking closely: review of PATCH 10 applies, doesn't it?
> >
>
> Yep!

Hm, actually, maybe not quite as cleanly.

The problem is we *are* initializing that field immediately with
whatever we were passed in during __init__, which means the field is
indeed Optional. Later, during check(), we happen to eliminate that
usage of None.

To remove the use of the @property trick here, we could:

... declare the field, then only initialize it if we were passed a
non-None value. But then check() would need to rely on something like
hasattr to check if it was set or not, which is maybe an unfortunate
code smell.
So I think you'd still wind up needing a ._tag_member field which is
Optional and always gets set during __init__, then setting a proper
.tag_member field during check().

Or I could just leave this one as-is. Or something else. I think the
dirt has to get swept somewhere, because we don't *always* have enough
information to fully initialize it at __init__ time, it's a
conditional delayed initialization, unlike the others which are
unconditionally delayed.

--js




reply via email to

[Prev in Thread] Current Thread [Next in Thread]