From 22a495d45c1abb8705702a271d3ba27b68433bea Mon Sep 17 00:00:00 2001 From: John Seong Date: Wed, 31 Dec 2025 18:50:44 -0800 Subject: [PATCH] gh-133403: Add type annotations to generate_levenshtein_examples.py --- .github/workflows/mypy.yml | 1 + .../2025-12-31-10-30-00.gh-issue-133403.aB3xYz.rst | 2 ++ Tools/build/generate_levenshtein_examples.py | 8 ++++---- Tools/build/mypy.ini | 1 + 4 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-12-31-10-30-00.gh-issue-133403.aB3xYz.rst diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index 8810730e193bb6..11903666a0493f 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -19,6 +19,7 @@ on: - "Tools/build/consts_getter.py" - "Tools/build/deepfreeze.py" - "Tools/build/generate-build-details.py" + - "Tools/build/generate_levenshtein_examples.py" - "Tools/build/generate_sbom.py" - "Tools/build/generate_stdlib_module_names.py" - "Tools/build/mypy.ini" diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-12-31-10-30-00.gh-issue-133403.aB3xYz.rst b/Misc/NEWS.d/next/Tools-Demos/2025-12-31-10-30-00.gh-issue-133403.aB3xYz.rst new file mode 100644 index 00000000000000..3c32bc0a2f9a3f --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2025-12-31-10-30-00.gh-issue-133403.aB3xYz.rst @@ -0,0 +1,2 @@ +Add type annotations to :file:`Tools/build/generate_levenshtein_examples.py` +and configure mypy to check it with strict type checking. diff --git a/Tools/build/generate_levenshtein_examples.py b/Tools/build/generate_levenshtein_examples.py index 30dcc7cf1a1479..2396c8040ca539 100644 --- a/Tools/build/generate_levenshtein_examples.py +++ b/Tools/build/generate_levenshtein_examples.py @@ -13,7 +13,7 @@ _CASE_COST = 1 -def _substitution_cost(ch_a, ch_b): +def _substitution_cost(ch_a: str, ch_b: str) -> int: if ch_a == ch_b: return 0 if ch_a.lower() == ch_b.lower(): @@ -22,7 +22,7 @@ def _substitution_cost(ch_a, ch_b): @lru_cache(None) -def levenshtein(a, b): +def levenshtein(a: str, b: str) -> int: if not a or not b: return (len(a) + len(b)) * _MOVE_COST option1 = levenshtein(a[:-1], b[:-1]) + _substitution_cost(a[-1], b[-1]) @@ -31,7 +31,7 @@ def levenshtein(a, b): return min(option1, option2, option3) -def main(): +def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('output_path', metavar='FILE', type=str) parser.add_argument('--overwrite', dest='overwrite', action='store_const', @@ -48,7 +48,7 @@ def main(): ) return - examples = set() + examples: set[tuple[str, str, int]] = set() # Create a lot of non-empty examples, which should end up with a Gauss-like # distribution for even costs (moves) and odd costs (case substitutions). while len(examples) < 9990: diff --git a/Tools/build/mypy.ini b/Tools/build/mypy.ini index 7d341afd1cd48b..5465e2d4b6171f 100644 --- a/Tools/build/mypy.ini +++ b/Tools/build/mypy.ini @@ -9,6 +9,7 @@ files = Tools/build/consts_getter.py, Tools/build/deepfreeze.py, Tools/build/generate-build-details.py, + Tools/build/generate_levenshtein_examples.py, Tools/build/generate_sbom.py, Tools/build/generate_stdlib_module_names.py, Tools/build/verify_ensurepip_wheels.py,