This is only used to pass in a dictionary with a comment already set, so
skip the runaround and just accept the comment.
This works because _tree_to_qlit() treats 'if': None; 'comment': None
exactly like absent 'if'; 'comment'.
Signed-off-by: John Snow <jsnow@redhat.com>
---
scripts/qapi/introspect.py | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py
index d3fbf694ad2..0aa3b77109f 100644
--- a/scripts/qapi/introspect.py
+++ b/scripts/qapi/introspect.py
@@ -10,6 +10,8 @@
See the COPYING file in the top-level directory.
"""
+from typing import Optional
+
from .common import (
c_name,
gen_endif,
@@ -24,11 +26,11 @@
)
-def _make_tree(obj, ifcond, extra=None):
- if extra is None:
- extra = {}
- if ifcond:
- extra['if'] = ifcond
+def _make_tree(obj, ifcond, comment=None):
+ extra = {
+ 'if': ifcond,
+ 'comment': comment,
+ }
return (obj, extra)
@@ -174,18 +176,18 @@ def _gen_features(features):
return [_make_tree(f.name, f.ifcond) for f in features]
def _gen_tree(self, name, mtype, obj, ifcond, features):
- extra = None
+ comment: Optional[str] = None
if mtype not in ('command', 'event', 'builtin', 'array'):
if not self._unmask:
# Output a comment to make it easy to map masked names
# back to the source when reading the generated output.
- extra = {'comment': '"%s" = %s' % (self._name(name), name)}
+ comment = f'"{self._name(name)}" = {name}'
name = self._name(name)
obj['name'] = name
obj['meta-type'] = mtype
if features:
obj['features'] = self._gen_features(features)
- self._trees.append(_make_tree(obj, ifcond, extra))
+ self._trees.append(_make_tree(obj, ifcond, comment))
def _gen_member(self, member):
obj = {'name': member.name, 'type': self._use_type(member.type)}
--
2.29.2
John Snow <jsnow@redhat.com> writes:
> This is only used to pass in a dictionary with a comment already set, so
> skip the runaround and just accept the comment.
>
> This works because _tree_to_qlit() treats 'if': None; 'comment': None
> exactly like absent 'if'; 'comment'.
Confusing, because the two paragraphs talk about two different things:
1. Actual arguments for @extra are either None or {'comment': comment}.
Simplify: replace parameter @extra by parameter @comment.
2. Dumb down the return value to always be of the form
(obj {'if': ifcond, 'comment': comment})
I suspect splitting the patch is easier than crafting a clear commit
message for the combined one.
>
> Signed-off-by: John Snow <jsnow@redhat.com>
> ---
> scripts/qapi/introspect.py | 18 ++++++++++--------
> 1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py
> index d3fbf694ad2..0aa3b77109f 100644
> --- a/scripts/qapi/introspect.py
> +++ b/scripts/qapi/introspect.py
> @@ -10,6 +10,8 @@
> See the COPYING file in the top-level directory.
> """
>
> +from typing import Optional
> +
> from .common import (
> c_name,
> gen_endif,
> @@ -24,11 +26,11 @@
> )
>
>
> -def _make_tree(obj, ifcond, extra=None):
> - if extra is None:
> - extra = {}
> - if ifcond:
> - extra['if'] = ifcond
> +def _make_tree(obj, ifcond, comment=None):
> + extra = {
> + 'if': ifcond,
> + 'comment': comment,
> + }
> return (obj, extra)
Obvious way to do just 1.:
def _make_tree(obj, ifcond, comment=None):
extra = {}
if ifcond:
extra['if'] = ifcond
if comment:
extra['comment'] = comment
>
>
> @@ -174,18 +176,18 @@ def _gen_features(features):
> return [_make_tree(f.name, f.ifcond) for f in features]
>
> def _gen_tree(self, name, mtype, obj, ifcond, features):
> - extra = None
> + comment: Optional[str] = None
> if mtype not in ('command', 'event', 'builtin', 'array'):
> if not self._unmask:
> # Output a comment to make it easy to map masked names
> # back to the source when reading the generated output.
> - extra = {'comment': '"%s" = %s' % (self._name(name), name)}
> + comment = f'"{self._name(name)}" = {name}'
> name = self._name(name)
> obj['name'] = name
> obj['meta-type'] = mtype
> if features:
> obj['features'] = self._gen_features(features)
> - self._trees.append(_make_tree(obj, ifcond, extra))
> + self._trees.append(_make_tree(obj, ifcond, comment))
>
> def _gen_member(self, member):
> obj = {'name': member.name, 'type': self._use_type(member.type)}
On 2/3/21 9:23 AM, Markus Armbruster wrote:
> John Snow <jsnow@redhat.com> writes:
>
>> This is only used to pass in a dictionary with a comment already set, so
>> skip the runaround and just accept the comment.
>>
>> This works because _tree_to_qlit() treats 'if': None; 'comment': None
>> exactly like absent 'if'; 'comment'.
>
> Confusing, because the two paragraphs talk about two different things:
>
> 1. Actual arguments for @extra are either None or {'comment': comment}.
> Simplify: replace parameter @extra by parameter @comment.
>
> 2. Dumb down the return value to always be of the form
>
> (obj {'if': ifcond, 'comment': comment})
>
I think you are drawing attention to the fact that 'if' and 'comment'
are now always present in this dict instead of conditionally present.
(else, I have misread you. (I think you are missing a comma.))
> I suspect splitting the patch is easier than crafting a clear commit
> message for the combined one.
>
I wouldn't have considered to break out such a small change into two
even smaller changes, but as you are in charge here ... Okey Dokey.
(meta-tangent: [1])
>>
>> Signed-off-by: John Snow <jsnow@redhat.com>
>> ---
>> scripts/qapi/introspect.py | 18 ++++++++++--------
>> 1 file changed, 10 insertions(+), 8 deletions(-)
>>
>> diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py
>> index d3fbf694ad2..0aa3b77109f 100644
>> --- a/scripts/qapi/introspect.py
>> +++ b/scripts/qapi/introspect.py
>> @@ -10,6 +10,8 @@
>> See the COPYING file in the top-level directory.
>> """
>>
>> +from typing import Optional
>> +
>> from .common import (
>> c_name,
>> gen_endif,
>> @@ -24,11 +26,11 @@
>> )
>>
>>
>> -def _make_tree(obj, ifcond, extra=None):
>> - if extra is None:
>> - extra = {}
>> - if ifcond:
>> - extra['if'] = ifcond
>> +def _make_tree(obj, ifcond, comment=None):
>> + extra = {
>> + 'if': ifcond,
>> + 'comment': comment,
>> + }
>> return (obj, extra)
>
> Obvious way to do just 1.:
>
> def _make_tree(obj, ifcond, comment=None):
> extra = {}
> if ifcond:
> extra['if'] = ifcond
> if comment:
> extra['comment'] = comment
>
OK.
>>
>>
>> @@ -174,18 +176,18 @@ def _gen_features(features):
>> return [_make_tree(f.name, f.ifcond) for f in features]
>>
>> def _gen_tree(self, name, mtype, obj, ifcond, features):
>> - extra = None
>> + comment: Optional[str] = None
>> if mtype not in ('command', 'event', 'builtin', 'array'):
>> if not self._unmask:
>> # Output a comment to make it easy to map masked names
>> # back to the source when reading the generated output.
>> - extra = {'comment': '"%s" = %s' % (self._name(name), name)}
>> + comment = f'"{self._name(name)}" = {name}'
>> name = self._name(name)
>> obj['name'] = name
>> obj['meta-type'] = mtype
>> if features:
>> obj['features'] = self._gen_features(features)
>> - self._trees.append(_make_tree(obj, ifcond, extra))
>> + self._trees.append(_make_tree(obj, ifcond, comment))
>>
>> def _gen_member(self, member):
>> obj = {'name': member.name, 'type': self._use_type(member.type)}
[1] As a matter of process, I sometimes find it cumbersome to
intentionally engineer an intermediary state when I jumped straight from
A->C in my actual editing.
I will usually keep such intermediary forms when they come about
naturally in the course of development, but rarely seek to add them
artificially -- it feels like a major bummer to engineer, test, and
scrutinize code that's only bound to be deleted immediately after.
Sometimes, it feels like a waste of reviewer effort, too.
It's been years and I still don't think I have any real intuitive sense
for this, which is ...unfortunate.
--js
John Snow <jsnow@redhat.com> writes:
> On 2/3/21 9:23 AM, Markus Armbruster wrote:
>> John Snow <jsnow@redhat.com> writes:
>>
>>> This is only used to pass in a dictionary with a comment already set, so
>>> skip the runaround and just accept the comment.
>>>
>>> This works because _tree_to_qlit() treats 'if': None; 'comment': None
>>> exactly like absent 'if'; 'comment'.
>> Confusing, because the two paragraphs talk about two different
>> things:
>> 1. Actual arguments for @extra are either None or {'comment':
>> comment}.
>> Simplify: replace parameter @extra by parameter @comment.
>> 2. Dumb down the return value to always be of the form
>> (obj {'if': ifcond, 'comment': comment})
>>
>
> I think you are drawing attention to the fact that 'if' and 'comment'
> are now always present in this dict instead of conditionally present.
Correct.
> (else, I have misread you. (I think you are missing a comma.))
I am! I meant to write
(obj, {'if': ifcond, 'comment': comment})
>> I suspect splitting the patch is easier than crafting a clear commit
>> message for the combined one.
>>
>
> I wouldn't have considered to break out such a small change into two
> even smaller changes, but as you are in charge here ... Okey Dokey.
>
> (meta-tangent: [1])
[...]
> [1] As a matter of process, I sometimes find it cumbersome to
> intentionally engineer an intermediary state when I jumped straight
> from A->C in my actual editing.
Yes, the extra work can be cumbersome. But then writing a neat commit
message for a commit that does two things can also be cumbersome.
"Split and write two straightforward commit messages" has proven easier
for me many times.
> I will usually keep such intermediary forms when they come about
> naturally in the course of development, but rarely seek to add them
> artificially -- it feels like a major bummer to engineer, test, and
> scrutinize code that's only bound to be deleted immediately after.
> Sometimes, it feels like a waste of reviewer effort, too.
It depends. Sometimes "don't split and write a complicated commit
message" is easier.
Which way you get to "commit message(s) don't confuse Markus" in this
particular case is up to you :)
> It's been years and I still don't think I have any real intuitive
> sense for this, which is ...unfortunate.
It's been years, and my intuition still evolves.
© 2016 - 2025 Red Hat, Inc.