From b9c362d3a36adbd9e7ab475e4fa2fe035bc0adcf Mon Sep 17 00:00:00 2001 From: Hunter Hogan Date: Sat, 27 Jun 2026 23:35:23 -0500 Subject: [PATCH 1/4] fnmatch calls os.path.normcase(arg) --- stdlib/fnmatch.pyi | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/stdlib/fnmatch.pyi b/stdlib/fnmatch.pyi index 345c4576497d..23815c57604f 100644 --- a/stdlib/fnmatch.pyi +++ b/stdlib/fnmatch.pyi @@ -1,15 +1,24 @@ import sys +from _typeshed import AnyOrLiteralStr from collections.abc import Iterable -from typing import AnyStr +from os import PathLike +from typing import AnyStr, overload __all__ = ["filter", "fnmatch", "fnmatchcase", "translate"] if sys.version_info >= (3, 14): __all__ += ["filterfalse"] -def fnmatch(name: AnyStr, pat: AnyStr) -> bool: ... +def fnmatch(name: AnyOrLiteralStr | PathLike[AnyStr], pat: AnyOrLiteralStr | PathLike[AnyStr]) -> bool: ... def fnmatchcase(name: AnyStr, pat: AnyStr) -> bool: ... -def filter(names: Iterable[AnyStr], pat: AnyStr) -> list[AnyStr]: ... +@overload +def filter(names: Iterable[AnyOrLiteralStr], pat: AnyOrLiteralStr) -> list[AnyOrLiteralStr]: ... +@overload +def filter(names: Iterable[AnyOrLiteralStr | PathLike[AnyStr]], pat: AnyOrLiteralStr | PathLike[AnyStr]) -> list[AnyStr]: ... def translate(pat: str) -> str: ... if sys.version_info >= (3, 14): - def filterfalse(names: Iterable[AnyStr], pat: AnyStr) -> list[AnyStr]: ... + @overload + def filterfalse(names: Iterable[AnyOrLiteralStr], pat: AnyOrLiteralStr) -> list[AnyOrLiteralStr]: ... + @overload + def filterfalse(names: Iterable[AnyOrLiteralStr | PathLike[AnyStr]], pat: AnyOrLiteralStr | PathLike[AnyStr]) -> list[AnyStr]: + ... From 2d03c0a0184692c0b20c7e60b19b8a484cca4d52 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 28 Jun 2026 05:03:48 +0000 Subject: [PATCH 2/4] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/fnmatch.pyi | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/stdlib/fnmatch.pyi b/stdlib/fnmatch.pyi index 23815c57604f..bfca1e07f11c 100644 --- a/stdlib/fnmatch.pyi +++ b/stdlib/fnmatch.pyi @@ -10,15 +10,18 @@ if sys.version_info >= (3, 14): def fnmatch(name: AnyOrLiteralStr | PathLike[AnyStr], pat: AnyOrLiteralStr | PathLike[AnyStr]) -> bool: ... def fnmatchcase(name: AnyStr, pat: AnyStr) -> bool: ... + @overload def filter(names: Iterable[AnyOrLiteralStr], pat: AnyOrLiteralStr) -> list[AnyOrLiteralStr]: ... @overload def filter(names: Iterable[AnyOrLiteralStr | PathLike[AnyStr]], pat: AnyOrLiteralStr | PathLike[AnyStr]) -> list[AnyStr]: ... + def translate(pat: str) -> str: ... if sys.version_info >= (3, 14): @overload def filterfalse(names: Iterable[AnyOrLiteralStr], pat: AnyOrLiteralStr) -> list[AnyOrLiteralStr]: ... @overload - def filterfalse(names: Iterable[AnyOrLiteralStr | PathLike[AnyStr]], pat: AnyOrLiteralStr | PathLike[AnyStr]) -> list[AnyStr]: - ... + def filterfalse( + names: Iterable[AnyOrLiteralStr | PathLike[AnyStr]], pat: AnyOrLiteralStr | PathLike[AnyStr] + ) -> list[AnyStr]: ... From f8349e585d42e47cd725d8f2fe4e6228a84019e3 Mon Sep 17 00:00:00 2001 From: Hunter Hogan Date: Sun, 28 Jun 2026 05:10:43 -0500 Subject: [PATCH 3/4] drop overload definitions. use narrow return. --- stdlib/fnmatch.pyi | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/stdlib/fnmatch.pyi b/stdlib/fnmatch.pyi index bfca1e07f11c..1543813c114e 100644 --- a/stdlib/fnmatch.pyi +++ b/stdlib/fnmatch.pyi @@ -2,7 +2,7 @@ import sys from _typeshed import AnyOrLiteralStr from collections.abc import Iterable from os import PathLike -from typing import AnyStr, overload +from typing import AnyStr __all__ = ["filter", "fnmatch", "fnmatchcase", "translate"] if sys.version_info >= (3, 14): @@ -10,18 +10,10 @@ if sys.version_info >= (3, 14): def fnmatch(name: AnyOrLiteralStr | PathLike[AnyStr], pat: AnyOrLiteralStr | PathLike[AnyStr]) -> bool: ... def fnmatchcase(name: AnyStr, pat: AnyStr) -> bool: ... - -@overload -def filter(names: Iterable[AnyOrLiteralStr], pat: AnyOrLiteralStr) -> list[AnyOrLiteralStr]: ... -@overload def filter(names: Iterable[AnyOrLiteralStr | PathLike[AnyStr]], pat: AnyOrLiteralStr | PathLike[AnyStr]) -> list[AnyStr]: ... - def translate(pat: str) -> str: ... if sys.version_info >= (3, 14): - @overload - def filterfalse(names: Iterable[AnyOrLiteralStr], pat: AnyOrLiteralStr) -> list[AnyOrLiteralStr]: ... - @overload def filterfalse( names: Iterable[AnyOrLiteralStr | PathLike[AnyStr]], pat: AnyOrLiteralStr | PathLike[AnyStr] ) -> list[AnyStr]: ... From a6943abf1f1a7f8cabda0aec3b58a57f2377c205 Mon Sep 17 00:00:00 2001 From: Hunter Hogan Date: Mon, 29 Jun 2026 08:34:35 -0500 Subject: [PATCH 4/4] `AnyStr`, not `AnyOrLiteralStr`. --- stdlib/fnmatch.pyi | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/stdlib/fnmatch.pyi b/stdlib/fnmatch.pyi index 1543813c114e..018139dc482b 100644 --- a/stdlib/fnmatch.pyi +++ b/stdlib/fnmatch.pyi @@ -1,5 +1,4 @@ import sys -from _typeshed import AnyOrLiteralStr from collections.abc import Iterable from os import PathLike from typing import AnyStr @@ -8,12 +7,10 @@ __all__ = ["filter", "fnmatch", "fnmatchcase", "translate"] if sys.version_info >= (3, 14): __all__ += ["filterfalse"] -def fnmatch(name: AnyOrLiteralStr | PathLike[AnyStr], pat: AnyOrLiteralStr | PathLike[AnyStr]) -> bool: ... +def fnmatch(name: AnyStr | PathLike[AnyStr], pat: AnyStr | PathLike[AnyStr]) -> bool: ... def fnmatchcase(name: AnyStr, pat: AnyStr) -> bool: ... -def filter(names: Iterable[AnyOrLiteralStr | PathLike[AnyStr]], pat: AnyOrLiteralStr | PathLike[AnyStr]) -> list[AnyStr]: ... +def filter(names: Iterable[AnyStr | PathLike[AnyStr]], pat: AnyStr | PathLike[AnyStr]) -> list[AnyStr]: ... def translate(pat: str) -> str: ... if sys.version_info >= (3, 14): - def filterfalse( - names: Iterable[AnyOrLiteralStr | PathLike[AnyStr]], pat: AnyOrLiteralStr | PathLike[AnyStr] - ) -> list[AnyStr]: ... + def filterfalse(names: Iterable[AnyStr | PathLike[AnyStr]], pat: AnyStr | PathLike[AnyStr]) -> list[AnyStr]: ...