From: John Snow <jsnow@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
"Thomas Huth" <thuth@redhat.com>,
qemu-devel@nongnu.org, "Markus Armbruster" <armbru@redhat.com>,
"Cleber Rosa" <crosa@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>
Subject: Re: [PATCH v4 41/46] qapi/introspect.py: create a typed 'Node' data structure
Date: Thu, 1 Oct 2020 13:59:44 -0400 [thread overview]
Message-ID: <89ba99a2-91fb-592e-ceb5-126d2aa5b01b@redhat.com> (raw)
In-Reply-To: <20200930195215.GA3717385@habkost.net>
On 9/30/20 3:52 PM, Eduardo Habkost wrote:
> On Wed, Sep 30, 2020 at 02:58:04PM -0400, John Snow wrote:
>> On 9/30/20 2:39 PM, Eduardo Habkost wrote:
>>> On Wed, Sep 30, 2020 at 12:31:45AM -0400, John Snow wrote:
>>>> This replaces _make_tree with Node.__init__(), effectively. By creating
>>>> it as a generic container, we can more accurately describe the exact
>>>> nature of this particular Node.
>>>>
>>>> Signed-off-by: John Snow <jsnow@redhat.com>
>>>> ---
>>>> scripts/qapi/introspect.py | 77 +++++++++++++++++++-------------------
>>>> 1 file changed, 38 insertions(+), 39 deletions(-)
>>>>
>>>> diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py
>>>> index 43b6ba5df1f..86286e755ca 100644
>>>> --- a/scripts/qapi/introspect.py
>>>> +++ b/scripts/qapi/introspect.py
>>>> @@ -12,11 +12,12 @@
>>>> from typing import (
>>>> Dict,
>>>> + Generic,
>>>> + Iterable,
>>>> List,
>>>> Optional,
>>>> Sequence,
>>>> - Tuple,
>>>> - Union,
>>>> + TypeVar,
>>>> )
>>>> from .common import (
>>>> @@ -43,42 +44,42 @@
>>>> # The correct type for TreeNode is actually:
>>>> -# Union[AnnotatedNode, List[TreeNode], Dict[str, TreeNode], str, bool]
>>>> +# Union[Node[TreeNode], List[TreeNode], Dict[str, TreeNode], str, bool]
>>>> # but mypy does not support recursive types yet.
>>>> TreeNode = object
>>>> +_NodeType = TypeVar('_NodeType', bound=TreeNode)
>>>> _DObject = Dict[str, object]
>>>> -Extra = Dict[str, object]
>>>> -AnnotatedNode = Tuple[TreeNode, Extra]
>>>
>>> Do you have plans to make Node replace TreeNode completely?
>>>
>>> I'd understand this patch as a means to reach that goal, but I'm
>>> not sure the intermediate state of having both Node and TreeNode
>>> types (that can be confused with each other) is desirable.
>>>
>>
>> The problem is that _tree_to_qlit still accepts a broad array of types. The
>> "TreeNode" comment above explains that those types are:
>>
>> Node[TreeNode], List[TreeNode], Dict[str, TreeNode], str, bool
>>
>> Three are containers, two are leaf values.
>> of the containers, the Node container is special in that it houses
>> explicitly one of the four other types (but never itself.)
>>
>> Even if I somehow always enforced Node[T] heading into _tree_to_qlit, I
>> would still need to describe what 'T' is, which is another recursive type
>> that I cannot exactly describe with mypy's current descriptive power:
>>
>> INNER_TYPE = List[Node[INNER_TYPE]], Dict[str, Node[INNER_TYPE]], str, bool
>>
>> And that's not really a huge win, or indeed any different to the existing
>> TreeNode being an "object".
>>
>> So ... no, I felt like I was going to stop here, where we have
>> fundamentally:
>>
>> 1. Undecorated nodes (list, dict, str, bool) ("TreeNode")
>> 2. Decorated nodes (Node[T]) ("Node")
>>
>> which leads to the question: Why bother swapping Tuple for Node at that
>> point?
>>
>> My answer is simply that having a strong type name allows us to distinguish
>> this from garden-variety Tuples that might sneak in for other reasons in
>> other data types.
>
> Would:
> AnnotatedNode = NewType('AnnotatedNode', Tuple[TreeNode, Extra])
> be enough, then?
>
I don't think so, because the runtime check still checks for tuple. I
like the consistency and simplicity of a named type.
>>
>> Maybe we want a different nomenclature though, like Node vs AnnotatedNode?
>
> Yes, I believe having a more explicit name would be better.
>
I give up on introspect.py; I'm dropping it from my series. I cannot
possibly justify another single second spent here.
--js
next prev parent reply other threads:[~2020-10-01 18:23 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-30 4:31 [PATCH v4 00/46] qapi: static typing conversion, pt1 John Snow
2020-09-30 4:31 ` [PATCH v4 01/46] [DO-NOT-MERGE] docs: replace single backtick (`) with double-backtick (``) John Snow
2020-09-30 4:31 ` [PATCH v4 02/46] docs: repair broken references John Snow
2020-09-30 4:31 ` [PATCH v4 03/46] [DO-NOT-MERGE] docs/sphinx: change default role to "any" John Snow
2020-09-30 4:31 ` [PATCH v4 04/46] qapi: modify docstrings to be sphinx-compatible John Snow
2020-09-30 8:47 ` Markus Armbruster
2020-09-30 17:22 ` John Snow
2020-10-01 8:52 ` Markus Armbruster
2020-10-01 14:48 ` John Snow
2020-10-02 9:19 ` Markus Armbruster
2020-10-02 15:14 ` John Snow
2020-09-30 17:38 ` John Snow
2020-10-01 8:54 ` Markus Armbruster
2020-10-01 14:28 ` John Snow
2020-09-30 4:31 ` [PATCH v4 05/46] [DO-NOT-MERGE] docs: enable sphinx-autodoc for scripts/qapi John Snow
2020-09-30 4:31 ` [PATCH v4 06/46] qapi-gen: Separate arg-parsing from generation John Snow
2020-09-30 4:31 ` [PATCH v4 07/46] qapi: move generator entrypoint into module John Snow
2020-09-30 4:31 ` [PATCH v4 08/46] [DO-NOT-MERGE] docs: add scripts/qapi/main to python manual John Snow
2020-09-30 4:31 ` [PATCH v4 09/46] qapi: Prefer explicit relative imports John Snow
2020-09-30 4:31 ` [PATCH v4 10/46] qapi: Remove wildcard includes John Snow
2020-09-30 4:31 ` [PATCH v4 11/46] qapi: enforce import order/styling with isort John Snow
2020-09-30 4:31 ` [PATCH v4 12/46] qapi: delint using flake8 John Snow
2020-09-30 4:31 ` [PATCH v4 13/46] qapi: add pylintrc John Snow
2020-09-30 4:31 ` [PATCH v4 14/46] qapi/common.py: Remove python compatibility workaround John Snow
2020-09-30 4:31 ` [PATCH v4 15/46] qapi/common.py: Add indent manager John Snow
2020-09-30 4:31 ` [PATCH v4 16/46] qapi/common.py: delint with pylint John Snow
2020-09-30 4:31 ` [PATCH v4 17/46] qapi/common.py: Replace one-letter 'c' variable John Snow
2020-09-30 4:31 ` [PATCH v4 18/46] qapi/common.py: check with pylint John Snow
2020-09-30 4:31 ` [PATCH v4 19/46] qapi/common.py: add type hint annotations John Snow
2020-09-30 4:31 ` [PATCH v4 20/46] qapi/common.py: Convert comments into docstrings, and elaborate John Snow
2020-09-30 4:31 ` [PATCH v4 21/46] qapi/common.py: move build_params into gen.py John Snow
2020-09-30 4:31 ` [PATCH v4 22/46] qapi: establish mypy type-checking baseline John Snow
2020-09-30 4:31 ` [PATCH v4 23/46] qapi/events.py: add type hint annotations John Snow
2020-09-30 4:31 ` [PATCH v4 24/46] qapi/events.py: Move comments into docstrings John Snow
2020-09-30 4:31 ` [PATCH v4 25/46] qapi/commands.py: Don't re-bind to variable of different type John Snow
2020-09-30 4:31 ` [PATCH v4 26/46] qapi/commands.py: add type hint annotations John Snow
2020-09-30 4:31 ` [PATCH v4 27/46] qapi/commands.py: enable checking with mypy John Snow
2020-09-30 4:31 ` [PATCH v4 28/46] qapi/source.py: add type hint annotations John Snow
2020-09-30 4:31 ` [PATCH v4 29/46] qapi/source.py: delint with pylint John Snow
2020-09-30 4:31 ` [PATCH v4 30/46] qapi/gen.py: Fix edge-case of _is_user_module John Snow
2020-09-30 11:03 ` Eduardo Habkost
2020-09-30 4:31 ` [PATCH v4 31/46] qapi/gen.py: add type hint annotations John Snow
2020-09-30 4:31 ` [PATCH v4 32/46] qapi/gen.py: Enable checking with mypy John Snow
2020-09-30 4:31 ` [PATCH v4 33/46] qapi/gen.py: Remove unused parameter John Snow
2020-09-30 4:31 ` [PATCH v4 34/46] qapi/gen.py: update write() to be more idiomatic John Snow
2020-09-30 4:31 ` [PATCH v4 35/46] qapi/gen.py: delint with pylint John Snow
2020-09-30 4:31 ` [PATCH v4 36/46] qapi/introspect.py: assert obj is a dict when features are given John Snow
2020-09-30 11:04 ` Eduardo Habkost
2020-09-30 4:31 ` [PATCH v4 37/46] qapi/instrospect.py: add preliminary type hint annotations John Snow
2020-09-30 18:31 ` Eduardo Habkost
2020-09-30 4:31 ` [PATCH v4 38/46] qapi/introspect.py: add _gen_features helper John Snow
2020-09-30 17:21 ` Eduardo Habkost
2020-09-30 4:31 ` [PATCH v4 39/46] qapi/introspect.py: Unify return type of _make_tree() John Snow
2020-09-30 18:24 ` Eduardo Habkost
2020-09-30 18:32 ` John Snow
2020-09-30 18:57 ` Eduardo Habkost
2020-09-30 19:02 ` John Snow
2020-09-30 4:31 ` [PATCH v4 40/46] qapi/introspect.py: replace 'extra' dict with 'comment' argument John Snow
2020-09-30 18:24 ` Eduardo Habkost
2020-09-30 4:31 ` [PATCH v4 41/46] qapi/introspect.py: create a typed 'Node' data structure John Snow
2020-09-30 18:39 ` Eduardo Habkost
2020-09-30 18:58 ` John Snow
2020-09-30 19:52 ` Eduardo Habkost
2020-10-01 17:59 ` John Snow [this message]
2020-09-30 4:31 ` [PATCH v4 42/46] qapi/types.py: add type hint annotations John Snow
2020-09-30 4:31 ` [PATCH v4 43/46] qapi/types.py: remove one-letter variables John Snow
2020-09-30 4:31 ` [PATCH v4 44/46] qapi/visit.py: assert tag_member contains a QAPISchemaEnumType John Snow
2020-09-30 4:31 ` [PATCH v4 45/46] qapi/visit.py: remove unused parameters from gen_visit_object John Snow
2020-09-30 4:31 ` [PATCH v4 46/46] qapi/visit.py: add type hint annotations John Snow
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=89ba99a2-91fb-592e-ceb5-126d2aa5b01b@redhat.com \
--to=jsnow@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=armbru@redhat.com \
--cc=crosa@redhat.com \
--cc=ehabkost@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=thuth@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).