From dfd9ed74af63acd56ce53c1f1450cc4f22f7eea0 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Mon, 23 May 2022 19:23:22 -0700 Subject: [PATCH 1/4] gettext: fix unconstrained TypeVar --- stdlib/gettext.pyi | 87 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 78 insertions(+), 9 deletions(-) diff --git a/stdlib/gettext.pyi b/stdlib/gettext.pyi index d0141c63b315..134cd12a0460 100644 --- a/stdlib/gettext.pyi +++ b/stdlib/gettext.pyi @@ -1,7 +1,8 @@ +import io import sys from _typeshed import StrPath from collections.abc import Container, Iterable, Sequence -from typing import Any, Protocol, TypeVar, overload +from typing import Any, Callable, Protocol, TypeVar, overload from typing_extensions import Final, Literal if sys.version_info >= (3, 11): @@ -113,6 +114,27 @@ def find(domain: str, localedir: StrPath | None = ..., languages: Iterable[str] _T = TypeVar("_T") if sys.version_info >= (3, 11): + @overload + def translation( + domain: str, + localedir: StrPath | None = ..., + languages: Iterable[str] | None = ..., + class_: None = ..., + fallback: Literal[False] = ..., + ) -> GNUTranslations: ... + @overload + def translation( + domain: str, + localedir: StrPath | None = ..., + languages: Iterable[str] | None = ..., + class_: None = ..., + *, + fallback: Literal[True], + ) -> GNUTranslations | NullTranslations: ... + @overload + def translation( + domain: str, localedir: StrPath | None, languages: Iterable[str] | None, class_: None, fallback: Literal[True] + ) -> GNUTranslations | NullTranslations: ... @overload def translation( domain: str, @@ -120,13 +142,22 @@ if sys.version_info >= (3, 11): languages: Iterable[str] | None = ..., class_: None = ..., fallback: bool = ..., - ) -> NullTranslations: ... + ) -> Any: ... @overload def translation( domain: str, localedir: StrPath | None = ..., languages: Iterable[str] | None = ..., - class_: type[_T] = ..., + *, + class_: Callable[[io.BufferedReader], _T], + fallback: Literal[False] = ..., + ) -> _T: ... + @overload + def translation( + domain: str, + localedir: StrPath | None, + languages: Iterable[str] | None, + class_: Callable[[io.BufferedReader], _T], fallback: Literal[False] = ..., ) -> _T: ... @overload @@ -134,12 +165,40 @@ if sys.version_info >= (3, 11): domain: str, localedir: StrPath | None = ..., languages: Iterable[str] | None = ..., - class_: type[Any] = ..., - fallback: Literal[True] = ..., + class_: Callable[[io.BufferedReader], Any] = ..., + fallback: bool = ..., ) -> Any: ... def install(domain: str, localedir: StrPath | None = ..., *, names: Container[str] | None = ...) -> None: ... else: + @overload + def translation( + domain: str, + localedir: StrPath | None = ..., + languages: Iterable[str] | None = ..., + class_: None = ..., + fallback: Literal[False] = ..., + codeset: str | None = ..., + ) -> GNUTranslations: ... + @overload + def translation( + domain: str, + localedir: StrPath | None = ..., + languages: Iterable[str] | None = ..., + class_: None = ..., + *, + fallback: Literal[True], + codeset: str | None = ..., + ) -> GNUTranslations | NullTranslations: ... + @overload + def translation( + domain: str, + localedir: StrPath | None, + languages: Iterable[str] | None, + class_: None, + fallback: Literal[True], + codeset: str | None = ..., + ) -> GNUTranslations | NullTranslations: ... @overload def translation( domain: str, @@ -148,13 +207,23 @@ else: class_: None = ..., fallback: bool = ..., codeset: str | None = ..., - ) -> NullTranslations: ... + ) -> Any: ... @overload def translation( domain: str, localedir: StrPath | None = ..., languages: Iterable[str] | None = ..., - class_: type[_T] = ..., + *, + class_: Callable[[io.BufferedReader], _T], + fallback: Literal[False] = ..., + codeset: str | None = ..., + ) -> _T: ... + @overload + def translation( + domain: str, + localedir: StrPath | None, + languages: Iterable[str] | None, + class_: Callable[[io.BufferedReader], _T], fallback: Literal[False] = ..., codeset: str | None = ..., ) -> _T: ... @@ -163,8 +232,8 @@ else: domain: str, localedir: StrPath | None = ..., languages: Iterable[str] | None = ..., - class_: type[Any] = ..., - fallback: Literal[True] = ..., + class_: Callable[[io.BufferedReader], Any] = ..., + fallback: bool = ..., codeset: str | None = ..., ) -> Any: ... def install( From 54a76a10845b724eda2937e4aa8884ffab24ecd5 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Mon, 23 May 2022 19:29:21 -0700 Subject: [PATCH 2/4] use the right Callable --- stdlib/gettext.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/gettext.pyi b/stdlib/gettext.pyi index 134cd12a0460..a5f9377cd802 100644 --- a/stdlib/gettext.pyi +++ b/stdlib/gettext.pyi @@ -1,8 +1,8 @@ import io import sys from _typeshed import StrPath -from collections.abc import Container, Iterable, Sequence -from typing import Any, Callable, Protocol, TypeVar, overload +from collections.abc import Callable, Container, Iterable, Sequence +from typing import Any, Protocol, TypeVar, overload from typing_extensions import Final, Literal if sys.version_info >= (3, 11): From 4ff7f8d2b94817fd2767f6055d69b97c1984e640 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Tue, 24 May 2022 18:11:30 -0700 Subject: [PATCH 3/4] everything is NullTranslations --- stdlib/gettext.pyi | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/stdlib/gettext.pyi b/stdlib/gettext.pyi index a5f9377cd802..d1e81bf11f53 100644 --- a/stdlib/gettext.pyi +++ b/stdlib/gettext.pyi @@ -111,7 +111,7 @@ def find( @overload def find(domain: str, localedir: StrPath | None = ..., languages: Iterable[str] | None = ..., all: bool = ...) -> Any: ... -_T = TypeVar("_T") +_T = TypeVar("_T", bound=NullTranslations) if sys.version_info >= (3, 11): @overload @@ -130,11 +130,11 @@ if sys.version_info >= (3, 11): class_: None = ..., *, fallback: Literal[True], - ) -> GNUTranslations | NullTranslations: ... + ) -> NullTranslations: ... @overload def translation( domain: str, localedir: StrPath | None, languages: Iterable[str] | None, class_: None, fallback: Literal[True] - ) -> GNUTranslations | NullTranslations: ... + ) -> NullTranslations: ... @overload def translation( domain: str, @@ -142,7 +142,7 @@ if sys.version_info >= (3, 11): languages: Iterable[str] | None = ..., class_: None = ..., fallback: bool = ..., - ) -> Any: ... + ) -> NullTranslations: ... @overload def translation( domain: str, @@ -165,9 +165,9 @@ if sys.version_info >= (3, 11): domain: str, localedir: StrPath | None = ..., languages: Iterable[str] | None = ..., - class_: Callable[[io.BufferedReader], Any] = ..., + class_: Callable[[io.BufferedReader], NullTranslations] = ..., fallback: bool = ..., - ) -> Any: ... + ) -> NullTranslations: ... def install(domain: str, localedir: StrPath | None = ..., *, names: Container[str] | None = ...) -> None: ... else: @@ -189,7 +189,7 @@ else: *, fallback: Literal[True], codeset: str | None = ..., - ) -> GNUTranslations | NullTranslations: ... + ) -> NullTranslations: ... @overload def translation( domain: str, @@ -198,7 +198,7 @@ else: class_: None, fallback: Literal[True], codeset: str | None = ..., - ) -> GNUTranslations | NullTranslations: ... + ) -> NullTranslations: ... @overload def translation( domain: str, @@ -207,7 +207,7 @@ else: class_: None = ..., fallback: bool = ..., codeset: str | None = ..., - ) -> Any: ... + ) -> NullTranslations: ... @overload def translation( domain: str, @@ -232,10 +232,10 @@ else: domain: str, localedir: StrPath | None = ..., languages: Iterable[str] | None = ..., - class_: Callable[[io.BufferedReader], Any] = ..., + class_: Callable[[io.BufferedReader], NullTranslations] = ..., fallback: bool = ..., codeset: str | None = ..., - ) -> Any: ... + ) -> NullTranslations: ... def install( domain: str, localedir: StrPath | None = ..., codeset: str | None = ..., names: Container[str] | None = ... ) -> None: ... From bfeaf604d0bde783f69fffd1af2cadc1f189e536 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Wed, 25 May 2022 20:03:44 -0700 Subject: [PATCH 4/4] Fewer overloads --- stdlib/gettext.pyi | 71 +++++++--------------------------------------- 1 file changed, 11 insertions(+), 60 deletions(-) diff --git a/stdlib/gettext.pyi b/stdlib/gettext.pyi index d1e81bf11f53..beb9318f9e43 100644 --- a/stdlib/gettext.pyi +++ b/stdlib/gettext.pyi @@ -111,7 +111,7 @@ def find( @overload def find(domain: str, localedir: StrPath | None = ..., languages: Iterable[str] | None = ..., all: bool = ...) -> Any: ... -_T = TypeVar("_T", bound=NullTranslations) +_NullTranslationsT = TypeVar("_NullTranslationsT", bound=NullTranslations) if sys.version_info >= (3, 11): @overload @@ -123,49 +123,28 @@ if sys.version_info >= (3, 11): fallback: Literal[False] = ..., ) -> GNUTranslations: ... @overload - def translation( - domain: str, - localedir: StrPath | None = ..., - languages: Iterable[str] | None = ..., - class_: None = ..., - *, - fallback: Literal[True], - ) -> NullTranslations: ... - @overload - def translation( - domain: str, localedir: StrPath | None, languages: Iterable[str] | None, class_: None, fallback: Literal[True] - ) -> NullTranslations: ... - @overload - def translation( - domain: str, - localedir: StrPath | None = ..., - languages: Iterable[str] | None = ..., - class_: None = ..., - fallback: bool = ..., - ) -> NullTranslations: ... - @overload def translation( domain: str, localedir: StrPath | None = ..., languages: Iterable[str] | None = ..., *, - class_: Callable[[io.BufferedReader], _T], + class_: Callable[[io.BufferedReader], _NullTranslationsT], fallback: Literal[False] = ..., - ) -> _T: ... + ) -> _NullTranslationsT: ... @overload def translation( domain: str, localedir: StrPath | None, languages: Iterable[str] | None, - class_: Callable[[io.BufferedReader], _T], + class_: Callable[[io.BufferedReader], _NullTranslationsT], fallback: Literal[False] = ..., - ) -> _T: ... + ) -> _NullTranslationsT: ... @overload def translation( domain: str, localedir: StrPath | None = ..., languages: Iterable[str] | None = ..., - class_: Callable[[io.BufferedReader], NullTranslations] = ..., + class_: Callable[[io.BufferedReader], NullTranslations] | None = ..., fallback: bool = ..., ) -> NullTranslations: ... def install(domain: str, localedir: StrPath | None = ..., *, names: Container[str] | None = ...) -> None: ... @@ -181,58 +160,30 @@ else: codeset: str | None = ..., ) -> GNUTranslations: ... @overload - def translation( - domain: str, - localedir: StrPath | None = ..., - languages: Iterable[str] | None = ..., - class_: None = ..., - *, - fallback: Literal[True], - codeset: str | None = ..., - ) -> NullTranslations: ... - @overload - def translation( - domain: str, - localedir: StrPath | None, - languages: Iterable[str] | None, - class_: None, - fallback: Literal[True], - codeset: str | None = ..., - ) -> NullTranslations: ... - @overload - def translation( - domain: str, - localedir: StrPath | None = ..., - languages: Iterable[str] | None = ..., - class_: None = ..., - fallback: bool = ..., - codeset: str | None = ..., - ) -> NullTranslations: ... - @overload def translation( domain: str, localedir: StrPath | None = ..., languages: Iterable[str] | None = ..., *, - class_: Callable[[io.BufferedReader], _T], + class_: Callable[[io.BufferedReader], _NullTranslationsT], fallback: Literal[False] = ..., codeset: str | None = ..., - ) -> _T: ... + ) -> _NullTranslationsT: ... @overload def translation( domain: str, localedir: StrPath | None, languages: Iterable[str] | None, - class_: Callable[[io.BufferedReader], _T], + class_: Callable[[io.BufferedReader], _NullTranslationsT], fallback: Literal[False] = ..., codeset: str | None = ..., - ) -> _T: ... + ) -> _NullTranslationsT: ... @overload def translation( domain: str, localedir: StrPath | None = ..., languages: Iterable[str] | None = ..., - class_: Callable[[io.BufferedReader], NullTranslations] = ..., + class_: Callable[[io.BufferedReader], NullTranslations] | None = ..., fallback: bool = ..., codeset: str | None = ..., ) -> NullTranslations: ...