gh-104683: clinic.py: Modernise `parse_converter()` using pattern-matching (#104696)

This commit is contained in:
Alex Waygood 2023-05-22 00:29:43 +01:00 committed by GitHub
parent cd9748409a
commit 4b107d86f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 19 additions and 15 deletions

View File

@ -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 == '*':