[3.12] gh-106359: Fix corner case bugs in Argument Clinic converter parser (GH-106361) by miss-islington · Pull Request #106364 · python/cpython
StateKeeper = Callable[[str | None], None] ConverterArgs = dict[str, Any]
class DSLParser: def __init__(self, clinic: Clinic) -> None:
KwargDict = dict[str | None, Any]
@staticmethod def parse_converter(annotation: ast.expr | None) -> tuple[str, bool, KwargDict]: def parse_converter( annotation: ast.expr | None ) -> tuple[str, bool, ConverterArgs]: 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 } kwargs: ConverterArgs = {} for node in annotation.keywords: if not isinstance(node.arg, str): fail("Cannot use a kwarg splat in a function-call annotation") kwargs[node.arg] = eval_ast_expr(node.value, symbols) return name, False, kwargs case _: fail(