qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH v5 15/36] qapi/common.py: add type hint annotations


From: John Snow
Subject: Re: [PATCH v5 15/36] qapi/common.py: add type hint annotations
Date: Wed, 7 Oct 2020 11:01:31 -0400
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.11.0

On 10/7/20 5:03 AM, Markus Armbruster wrote:
John Snow <jsnow@redhat.com> writes:

Annotations do not change runtime behavior.
This commit *only* adds annotations.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Reviewed-by: Cleber Rosa <crosa@redhat.com>
---
  scripts/qapi/common.py | 27 ++++++++++++++++-----------
  1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
index 338adedef4f..74a2c001ed9 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -12,6 +12,7 @@
  # See the COPYING file in the top-level directory.
import re
+from typing import Optional, Sequence
EATSPACE = '\033EATSPACE.'
@@ -22,7 +23,7 @@
  # ENUMName -> ENUM_NAME, EnumName1 -> ENUM_NAME1
  # ENUM_NAME -> ENUM_NAME, ENUM_NAME1 -> ENUM_NAME1, ENUM_Name2 -> ENUM_NAME2
  # ENUM24_Name -> ENUM24_NAME
-def camel_to_upper(value):
+def camel_to_upper(value: str) -> str:
      c_fun_str = c_name(value, False)
      if value.isupper():
          return c_fun_str
@@ -41,7 +42,9 @@ def camel_to_upper(value):
      return new_name.lstrip('_').upper()
-def c_enum_const(type_name, const_name, prefix=None):
+def c_enum_const(type_name: str,
+                 const_name: str,
+                 prefix: Optional[str] = None) -> str:
      if prefix is not None:
          type_name = prefix
      return camel_to_upper(type_name) + '_' + c_name(const_name, False).upper()
@@ -56,7 +59,7 @@ def c_enum_const(type_name, const_name, prefix=None):
  # into substrings of a generated C function name.
  # '__a.b_c' -> '__a_b_c', 'x-foo' -> 'x_foo'
  # protect=True: 'int' -> 'q_int'; protect=False: 'int' -> 'int'
-def c_name(name, protect=True):
+def c_name(name: str, protect: bool = True) -> str:
      # ANSI X3J11/88-090, 3.1.1
      c89_words = set(['auto', 'break', 'case', 'char', 'const', 'continue',
                       'default', 'do', 'double', 'else', 'enum', 'extern',
@@ -131,24 +134,24 @@ def decrease(self, amount: int = 4) -> None:
# Generate @code with @kwds interpolated.
  # Obey indent, and strip EATSPACE.
-def cgen(code, **kwds):
+def cgen(code: str, **kwds: object) -> str:
      raw = code % kwds
      if indent:
          raw = re.sub(r'^(?!(#|$))', str(indent), raw, flags=re.MULTILINE)
      return re.sub(re.escape(EATSPACE) + r' *', '', raw)
-def mcgen(code, **kwds):
+def mcgen(code: str, **kwds: object) -> str:
      if code[0] == '\n':
          code = code[1:]
      return cgen(code, **kwds)
-def c_fname(filename):
+def c_fname(filename: str) -> str:
      return re.sub(r'[^A-Za-z0-9_]', '_', filename)
-def guardstart(name):
+def guardstart(name: str) -> str:
      return mcgen('''
  #ifndef %(name)s
  #define %(name)s
@@ -157,7 +160,7 @@ def guardstart(name):
                   name=c_fname(name).upper())
-def guardend(name):
+def guardend(name: str) -> str:
      return mcgen('''
#endif /* %(name)s */
@@ -165,7 +168,7 @@ def guardend(name):
                   name=c_fname(name).upper())
-def gen_if(ifcond):
+def gen_if(ifcond: Sequence[str]) -> str:
      ret = ''
      for ifc in ifcond:
          ret += mcgen('''
@@ -174,7 +177,7 @@ def gen_if(ifcond):
      return ret
-def gen_endif(ifcond):
+def gen_endif(ifcond: Sequence[str]) -> str:
      ret = ''
      for ifc in reversed(ifcond):
          ret += mcgen('''
@@ -183,7 +186,9 @@ def gen_endif(ifcond):
      return ret
-def build_params(arg_type, boxed, extra=None):
+def build_params(arg_type,
+                 boxed: bool,
+                 extra: Optional[str] = None) -> str:
      ret = ''
      sep = ''
      if boxed:

@arg_type is the only parameter left unannotated.  Scratching head...
aha:

     qapi/common.py: move build_params into gen.py
Including it in common.py creates a circular import dependency; schema
     relies on common, but common.build_params requires a type annotation
     from schema. To type this properly, it needs to be moved outside the
     cycle.

Let's amend the commit message:

     Note that build_params() cannot be fully annotated due to import
     dependency issues.  The commit after next will take care of it.

If we swap the next two commits, the fix follows immediately.  Better,
but only worth it if swapping is pretty much effortless.


The reason they're not flipped was to avoid giving the impression that docstrings were what was preventing us from enabling the mypy type checking.

The reason I don't flip the comments and the type hints is because that's a lot of rebase pain for perceptibly little benefit.

I amended the commit message.




reply via email to

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