From f7c81e749c023671e8bde3b3c560a51914303b07 Mon Sep 17 00:00:00 2001 From: AlexWaygood Date: Tue, 24 May 2022 21:14:34 +0100 Subject: [PATCH 1/9] `tempfile`: Fix `TypeVar` usage --- stdlib/tempfile.pyi | 24 ++++++++++++----- stubs/Markdown/markdown/util.pyi | 19 ++++++++------ stubs/mypy-extensions/mypy_extensions.pyi | 32 ++++++++++++++++++----- 3 files changed, 54 insertions(+), 21 deletions(-) diff --git a/stdlib/tempfile.pyi b/stdlib/tempfile.pyi index 9efa2d942401..0d5533a16a94 100644 --- a/stdlib/tempfile.pyi +++ b/stdlib/tempfile.pyi @@ -381,19 +381,31 @@ class TemporaryDirectory(Generic[AnyStr]): def __class_getitem__(cls, item: Any) -> GenericAlias: ... @overload -def mkstemp() -> tuple[int, str]: ... +def mkstemp(suffix: None = ..., prefix: None = ..., dir: None = ..., text: bool = ...) -> tuple[int, str]: ... @overload def mkstemp( - suffix: AnyStr | None = ..., prefix: AnyStr | None = ..., dir: _DirT[AnyStr] | None = ..., text: bool = ... + suffix: AnyStr, prefix: AnyStr | None = ..., dir: _DirT[AnyStr] | None = ..., text: bool = ... ) -> tuple[int, AnyStr]: ... @overload -def mkdtemp() -> str: ... +def mkstemp(*, prefix: AnyStr, dir: _DirT[AnyStr] | None = ..., text: bool = ...) -> tuple[int, AnyStr]: ... @overload -def mkdtemp(suffix: AnyStr | None = ..., prefix: AnyStr | None = ..., dir: _DirT[AnyStr] | None = ...) -> AnyStr: ... +def mkstemp(*, dir: _DirT[AnyStr], text: bool = ...) -> tuple[int, AnyStr]: ... @overload -def mktemp() -> str: ... +def mkdtemp(suffix: None = ..., prefix: None = ..., dir: None = ...) -> str: ... @overload -def mktemp(suffix: AnyStr | None = ..., prefix: AnyStr | None = ..., dir: _DirT[AnyStr] | None = ...) -> AnyStr: ... +def mkdtemp(suffix: AnyStr, prefix: AnyStr | None = ..., dir: _DirT[AnyStr] | None = ...) -> AnyStr: ... +@overload +def mkdtemp(*, prefix: AnyStr, dir: _DirT[AnyStr] | None = ...) -> AnyStr: ... +@overload +def mkdtemp(*, dir: _DirT[AnyStr]) -> AnyStr: ... +@overload +def mktemp(suffix: None = ..., prefix: None = ..., dir: None = ...) -> str: ... +@overload +def mktemp(suffix: AnyStr, prefix: AnyStr | None = ..., dir: _DirT[AnyStr] | None = ...) -> AnyStr: ... +@overload +def mktemp(*, prefix: AnyStr, dir: _DirT[AnyStr] | None = ...) -> AnyStr: ... +@overload +def mktemp(*, dir: _DirT[AnyStr]) -> AnyStr: ... def gettempdirb() -> bytes: ... def gettempprefixb() -> bytes: ... def gettempdir() -> str: ... diff --git a/stubs/Markdown/markdown/util.pyi b/stubs/Markdown/markdown/util.pyi index 5d132fe04f8d..e26fc71af821 100644 --- a/stubs/Markdown/markdown/util.pyi +++ b/stubs/Markdown/markdown/util.pyi @@ -1,4 +1,4 @@ -from typing import Any, Pattern +from typing import Any, Pattern, overload PY37: bool __deprecated__: Any @@ -41,15 +41,18 @@ class HtmlStash: class Registry: def __init__(self) -> None: ... - def __contains__(self, item): ... + def __contains__(self, item: object) -> bool: ... def __iter__(self) -> Any: ... - def __getitem__(self, key): ... + @overload + def __getitem__(self, key: slice) -> Registry: ... + @overload + def __getitem__(self, key: str | int) -> Any: ... def __len__(self): ... def get_index_for_name(self, name: str) -> int: ... - def register(self, item, name, priority) -> None: ... - def deregister(self, name, strict: bool = ...) -> None: ... - def __setitem__(self, key, value) -> None: ... - def __delitem__(self, key) -> None: ... - def add(self, key, value, location) -> None: ... + def register(self, item: Any, name: str, priority: float) -> None: ... + def deregister(self, name: str, strict: bool = ...) -> None: ... + def __setitem__(self, key: str, value: Any) -> None: ... + def __delitem__(self, key: str) -> None: ... + def add(self, key: str, value: Any, location: str) -> None: ... def __getattr__(name): ... diff --git a/stubs/mypy-extensions/mypy_extensions.pyi b/stubs/mypy-extensions/mypy_extensions.pyi index 412c3cb15142..705a56507de0 100644 --- a/stubs/mypy-extensions/mypy_extensions.pyi +++ b/stubs/mypy-extensions/mypy_extensions.pyi @@ -1,7 +1,7 @@ import abc from _typeshed import Self from collections.abc import Callable, ItemsView, KeysView, Mapping, ValuesView -from typing import Any, Generic, TypeVar +from typing import Any, Generic, TypeVar, overload _T = TypeVar("_T") _U = TypeVar("_U") @@ -21,12 +21,30 @@ class _TypedDict(Mapping[str, object], metaclass=abc.ABCMeta): def __delitem__(self, k: NoReturn) -> None: ... def TypedDict(typename: str, fields: dict[str, type[Any]], total: bool = ...) -> type[dict[str, Any]]: ... -def Arg(type: _T = ..., name: str | None = ...) -> _T: ... -def DefaultArg(type: _T = ..., name: str | None = ...) -> _T: ... -def NamedArg(type: _T = ..., name: str | None = ...) -> _T: ... -def DefaultNamedArg(type: _T = ..., name: str | None = ...) -> _T: ... -def VarArg(type: _T = ...) -> _T: ... -def KwArg(type: _T = ...) -> _T: ... +@overload +def Arg(type: _T, name: str | None = ...) -> _T: ... +@overload +def Arg(*, name: str | None = ...) -> Any: ... +@overload +def DefaultArg(type: _T, name: str | None = ...) -> _T: ... +@overload +def DefaultArg(*, name: str | None = ...) -> Any: ... +@overload +def NamedArg(type: _T, name: str | None = ...) -> _T: ... +@overload +def NamedArg(*, name: str | None = ...) -> Any: ... +@overload +def DefaultNamedArg(type: _T, name: str | None = ...) -> _T: ... +@overload +def DefaultNamedArg(*, name: str | None = ...) -> Any: ... +@overload +def VarArg(type: _T) -> _T: ... +@overload +def VarArg() -> Any: ... +@overload +def KwArg(type: _T) -> _T: ... +@overload +def KwArg() -> Any: ... # Return type that indicates a function does not return. # Deprecated: Use typing.NoReturn instead. From 576a2233d8018c29cc781c3dcd69250fad43b863 Mon Sep 17 00:00:00 2001 From: AlexWaygood Date: Tue, 24 May 2022 21:26:51 +0100 Subject: [PATCH 2/9] `mktemp` isn't actually generic anyway --- stdlib/tempfile.pyi | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/stdlib/tempfile.pyi b/stdlib/tempfile.pyi index 0d5533a16a94..683a04d10d83 100644 --- a/stdlib/tempfile.pyi +++ b/stdlib/tempfile.pyi @@ -1,7 +1,7 @@ import io import os import sys -from _typeshed import Self, WriteableBuffer +from _typeshed import Self, StrPath, WriteableBuffer from collections.abc import Iterable, Iterator from types import TracebackType from typing import IO, Any, AnyStr, Generic, overload @@ -398,14 +398,7 @@ def mkdtemp(suffix: AnyStr, prefix: AnyStr | None = ..., dir: _DirT[AnyStr] | No def mkdtemp(*, prefix: AnyStr, dir: _DirT[AnyStr] | None = ...) -> AnyStr: ... @overload def mkdtemp(*, dir: _DirT[AnyStr]) -> AnyStr: ... -@overload -def mktemp(suffix: None = ..., prefix: None = ..., dir: None = ...) -> str: ... -@overload -def mktemp(suffix: AnyStr, prefix: AnyStr | None = ..., dir: _DirT[AnyStr] | None = ...) -> AnyStr: ... -@overload -def mktemp(*, prefix: AnyStr, dir: _DirT[AnyStr] | None = ...) -> AnyStr: ... -@overload -def mktemp(*, dir: _DirT[AnyStr]) -> AnyStr: ... +def mktemp(suffix: str = ..., prefix: str = ..., dir: StrPath | None = ...) -> str: ... def gettempdirb() -> bytes: ... def gettempprefixb() -> bytes: ... def gettempdir() -> str: ... From 8042c1ae2e28e092024e144bb5f8377ad6c65881 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Tue, 24 May 2022 18:41:09 -0700 Subject: [PATCH 3/9] Let's try it --- stdlib/tempfile.pyi | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/stdlib/tempfile.pyi b/stdlib/tempfile.pyi index 683a04d10d83..7db3dc3a87f7 100644 --- a/stdlib/tempfile.pyi +++ b/stdlib/tempfile.pyi @@ -384,20 +384,18 @@ class TemporaryDirectory(Generic[AnyStr]): def mkstemp(suffix: None = ..., prefix: None = ..., dir: None = ..., text: bool = ...) -> tuple[int, str]: ... @overload def mkstemp( - suffix: AnyStr, prefix: AnyStr | None = ..., dir: _DirT[AnyStr] | None = ..., text: bool = ... -) -> tuple[int, AnyStr]: ... + suffix: str | None, prefix: str | None = ..., dir: _DirT[str] | None = ..., text: bool = ... +) -> tuple[int, str]: ... @overload -def mkstemp(*, prefix: AnyStr, dir: _DirT[AnyStr] | None = ..., text: bool = ...) -> tuple[int, AnyStr]: ... -@overload -def mkstemp(*, dir: _DirT[AnyStr], text: bool = ...) -> tuple[int, AnyStr]: ... +def mkstemp( + suffix: bytes | None, prefix: bytes | None = ..., dir: _DirT[bytes] | None = ..., text: bool = ... +) -> tuple[int, bytes]: ... @overload def mkdtemp(suffix: None = ..., prefix: None = ..., dir: None = ...) -> str: ... @overload -def mkdtemp(suffix: AnyStr, prefix: AnyStr | None = ..., dir: _DirT[AnyStr] | None = ...) -> AnyStr: ... -@overload -def mkdtemp(*, prefix: AnyStr, dir: _DirT[AnyStr] | None = ...) -> AnyStr: ... +def mkdtemp(suffix: str | None = ..., prefix: str | None = ..., dir: _DirT[str] | None = ...) -> str: ... @overload -def mkdtemp(*, dir: _DirT[AnyStr]) -> AnyStr: ... +def mkdtemp(suffix: bytes | None = ..., prefix: bytes | None = ..., dir: _DirT[bytes] | None = ...) -> bytes: ... def mktemp(suffix: str = ..., prefix: str = ..., dir: StrPath | None = ...) -> str: ... def gettempdirb() -> bytes: ... def gettempprefixb() -> bytes: ... From ce09b82290ec4cb5155f2479e804ec96b2891b5e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 25 May 2022 01:42:29 +0000 Subject: [PATCH 4/9] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/tempfile.pyi | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/stdlib/tempfile.pyi b/stdlib/tempfile.pyi index 7db3dc3a87f7..4b0b24e8eef4 100644 --- a/stdlib/tempfile.pyi +++ b/stdlib/tempfile.pyi @@ -383,9 +383,7 @@ class TemporaryDirectory(Generic[AnyStr]): @overload def mkstemp(suffix: None = ..., prefix: None = ..., dir: None = ..., text: bool = ...) -> tuple[int, str]: ... @overload -def mkstemp( - suffix: str | None, prefix: str | None = ..., dir: _DirT[str] | None = ..., text: bool = ... -) -> tuple[int, str]: ... +def mkstemp(suffix: str | None, prefix: str | None = ..., dir: _DirT[str] | None = ..., text: bool = ...) -> tuple[int, str]: ... @overload def mkstemp( suffix: bytes | None, prefix: bytes | None = ..., dir: _DirT[bytes] | None = ..., text: bool = ... From f81aeaabe0c10ffa46a944810b6352bf168932f4 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Tue, 24 May 2022 18:45:10 -0700 Subject: [PATCH 5/9] all-None overloads are redundant --- stdlib/tempfile.pyi | 4 ---- 1 file changed, 4 deletions(-) diff --git a/stdlib/tempfile.pyi b/stdlib/tempfile.pyi index 4b0b24e8eef4..afbb961c4b88 100644 --- a/stdlib/tempfile.pyi +++ b/stdlib/tempfile.pyi @@ -380,8 +380,6 @@ class TemporaryDirectory(Generic[AnyStr]): if sys.version_info >= (3, 9): def __class_getitem__(cls, item: Any) -> GenericAlias: ... -@overload -def mkstemp(suffix: None = ..., prefix: None = ..., dir: None = ..., text: bool = ...) -> tuple[int, str]: ... @overload def mkstemp(suffix: str | None, prefix: str | None = ..., dir: _DirT[str] | None = ..., text: bool = ...) -> tuple[int, str]: ... @overload @@ -389,8 +387,6 @@ def mkstemp( suffix: bytes | None, prefix: bytes | None = ..., dir: _DirT[bytes] | None = ..., text: bool = ... ) -> tuple[int, bytes]: ... @overload -def mkdtemp(suffix: None = ..., prefix: None = ..., dir: None = ...) -> str: ... -@overload def mkdtemp(suffix: str | None = ..., prefix: str | None = ..., dir: _DirT[str] | None = ...) -> str: ... @overload def mkdtemp(suffix: bytes | None = ..., prefix: bytes | None = ..., dir: _DirT[bytes] | None = ...) -> bytes: ... From f39775c92bdd4f7a05d97e9b987be8c86afcbe89 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Tue, 24 May 2022 18:49:45 -0700 Subject: [PATCH 6/9] type ignore --- stdlib/tempfile.pyi | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/stdlib/tempfile.pyi b/stdlib/tempfile.pyi index afbb961c4b88..3703039a7b7f 100644 --- a/stdlib/tempfile.pyi +++ b/stdlib/tempfile.pyi @@ -380,14 +380,20 @@ class TemporaryDirectory(Generic[AnyStr]): if sys.version_info >= (3, 9): def __class_getitem__(cls, item: Any) -> GenericAlias: ... +# The overloads are overlapping according to mypy, but they should still work fine. @overload -def mkstemp(suffix: str | None, prefix: str | None = ..., dir: _DirT[str] | None = ..., text: bool = ...) -> tuple[int, str]: ... +def mkstemp( # type: ignore[misc] + suffix: str | None, prefix: str | None = ..., dir: _DirT[str] | None = ..., text: bool = ... +) -> tuple[int, str]: ... @overload def mkstemp( suffix: bytes | None, prefix: bytes | None = ..., dir: _DirT[bytes] | None = ..., text: bool = ... ) -> tuple[int, bytes]: ... +# The overloads are overlapping according to mypy, but they should still work fine. @overload -def mkdtemp(suffix: str | None = ..., prefix: str | None = ..., dir: _DirT[str] | None = ...) -> str: ... +def mkdtemp( # type: ignore[misc] + suffix: str | None = ..., prefix: str | None = ..., dir: _DirT[str] | None = ... +) -> str: ... @overload def mkdtemp(suffix: bytes | None = ..., prefix: bytes | None = ..., dir: _DirT[bytes] | None = ...) -> bytes: ... def mktemp(suffix: str = ..., prefix: str = ..., dir: StrPath | None = ...) -> str: ... From 2c09296bce6f1c26d66c8df0aa7b5083217a3a83 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 25 May 2022 01:51:03 +0000 Subject: [PATCH 7/9] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/tempfile.pyi | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/stdlib/tempfile.pyi b/stdlib/tempfile.pyi index 3703039a7b7f..5fc2dc82d4c3 100644 --- a/stdlib/tempfile.pyi +++ b/stdlib/tempfile.pyi @@ -389,11 +389,10 @@ def mkstemp( # type: ignore[misc] def mkstemp( suffix: bytes | None, prefix: bytes | None = ..., dir: _DirT[bytes] | None = ..., text: bool = ... ) -> tuple[int, bytes]: ... + # The overloads are overlapping according to mypy, but they should still work fine. @overload -def mkdtemp( # type: ignore[misc] - suffix: str | None = ..., prefix: str | None = ..., dir: _DirT[str] | None = ... -) -> str: ... +def mkdtemp(suffix: str | None = ..., prefix: str | None = ..., dir: _DirT[str] | None = ...) -> str: ... # type: ignore[misc] @overload def mkdtemp(suffix: bytes | None = ..., prefix: bytes | None = ..., dir: _DirT[bytes] | None = ...) -> bytes: ... def mktemp(suffix: str = ..., prefix: str = ..., dir: StrPath | None = ...) -> str: ... From b85f7f559acdd295f8684dd6523858763abf18c6 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Tue, 24 May 2022 18:52:59 -0700 Subject: [PATCH 8/9] missing default --- stdlib/tempfile.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/tempfile.pyi b/stdlib/tempfile.pyi index 5fc2dc82d4c3..0d66e828081d 100644 --- a/stdlib/tempfile.pyi +++ b/stdlib/tempfile.pyi @@ -383,11 +383,11 @@ class TemporaryDirectory(Generic[AnyStr]): # The overloads are overlapping according to mypy, but they should still work fine. @overload def mkstemp( # type: ignore[misc] - suffix: str | None, prefix: str | None = ..., dir: _DirT[str] | None = ..., text: bool = ... + suffix: str | None = ..., prefix: str | None = ..., dir: _DirT[str] | None = ..., text: bool = ... ) -> tuple[int, str]: ... @overload def mkstemp( - suffix: bytes | None, prefix: bytes | None = ..., dir: _DirT[bytes] | None = ..., text: bool = ... + suffix: bytes | None = ..., prefix: bytes | None = ..., dir: _DirT[bytes] | None = ..., text: bool = ... ) -> tuple[int, bytes]: ... # The overloads are overlapping according to mypy, but they should still work fine. From 9e5a832a6b672ebecf1e42c8798ab41ad532e456 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Wed, 25 May 2022 06:32:48 +0100 Subject: [PATCH 9/9] Better comments --- stdlib/tempfile.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/tempfile.pyi b/stdlib/tempfile.pyi index 0d66e828081d..3499ee8c99bf 100644 --- a/stdlib/tempfile.pyi +++ b/stdlib/tempfile.pyi @@ -380,7 +380,7 @@ class TemporaryDirectory(Generic[AnyStr]): if sys.version_info >= (3, 9): def __class_getitem__(cls, item: Any) -> GenericAlias: ... -# The overloads are overlapping according to mypy, but they should still work fine. +# The overloads overlap, but they should still work fine. @overload def mkstemp( # type: ignore[misc] suffix: str | None = ..., prefix: str | None = ..., dir: _DirT[str] | None = ..., text: bool = ... @@ -390,7 +390,7 @@ def mkstemp( suffix: bytes | None = ..., prefix: bytes | None = ..., dir: _DirT[bytes] | None = ..., text: bool = ... ) -> tuple[int, bytes]: ... -# The overloads are overlapping according to mypy, but they should still work fine. +# The overloads overlap, but they should still work fine. @overload def mkdtemp(suffix: str | None = ..., prefix: str | None = ..., dir: _DirT[str] | None = ...) -> str: ... # type: ignore[misc] @overload