]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-104683: clinic.py: Modernise `parse_converter()` using pattern-matching (#104696)
authorAlex Waygood <Alex.Waygood@Gmail.com>
Sun, 21 May 2023 23:29:43 +0000 (00:29 +0100)
committerGitHub <noreply@github.com>
Sun, 21 May 2023 23:29:43 +0000 (23:29 +0000)
Tools/clinic/clinic.py

index 1d7b778da70990f6c1cb0076c6f1b565b0465629..d182e5e7764e46e6078da4f899d220d2bd99cdf0 100755 (executable)
@@ -5016,22 +5016,26 @@ class DSLParser:
         key = f"{parameter_name}_as_{c_name}" if c_name else parameter_name
         self.function.parameters[key] = p
 
-    def parse_converter(self, annotation):
-        if (isinstance(annotation, ast.Constant) and
-            type(annotation.value) is str):
-            return annotation.value, True, {}
+    KwargDict = dict[str | None, Any]
 
-        if isinstance(annotation, ast.Name):
-            return annotation.id, False, {}
-
-        if not isinstance(annotation, ast.Call):
-            fail("Annotations must be either a name, a function call, or a string.")
-
-        name = annotation.func.id
-        symbols = globals()
-
-        kwargs = {node.arg: eval_ast_expr(node.value, symbols) for node in annotation.keywords}
-        return name, False, kwargs
+    @staticmethod
+    def parse_converter(annotation: ast.expr | None) -> tuple[str, bool, KwargDict]:
+        match annotation:
+            case ast.Constant(value=str() as value):
+                return value, True, {}
+            case ast.Name(name):
+                return name, False, {}
+            case ast.Call(func=ast.Name(name)):
+                symbols = globals()
+                kwargs = {
+                    node.arg: eval_ast_expr(node.value, symbols)
+                    for node in annotation.keywords
+                }
+                return name, False, kwargs
+            case _:
+                fail(
+                    "Annotations must be either a name, a function call, or a string."
+                )
 
     def parse_special_symbol(self, symbol):
         if symbol == '*':