From 4cf3365ad11aeeb6872d295a433da096d217b65f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20W=C3=B6rtwein?= Date: Tue, 31 Aug 2021 17:31:24 -0400 Subject: [PATCH 1/5] make property generic --- stdlib/abc.pyi | 2 +- stdlib/builtins.pyi | 32 +++++++++++++++++++------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/stdlib/abc.pyi b/stdlib/abc.pyi index 7896e910c81f..940b8f3d4c76 100644 --- a/stdlib/abc.pyi +++ b/stdlib/abc.pyi @@ -15,7 +15,7 @@ class ABCMeta(type): def abstractmethod(funcobj: _FuncT) -> _FuncT: ... -class abstractproperty(property): ... +class abstractproperty(property[Any, Any]): ... # These two are deprecated and not supported by mypy def abstractstaticmethod(callable: _FuncT) -> _FuncT: ... diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 095921f6bb00..cc5f35521854 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -920,23 +920,29 @@ class range(Sequence[int]): def __repr__(self) -> str: ... def __reversed__(self) -> Iterator[int]: ... -class property(object): - fget: Callable[[Any], Any] | None - fset: Callable[[Any, Any], None] | None - fdel: Callable[[Any], None] | None +_F = TypeVar("_F") +_G = TypeVar("_G") + +class property(Generic[_F, _G]): + fget: Callable[[_F], _G] | None + fset: Callable[[_F, _G], None] | None + fdel: Callable[[_G], None] | None def __init__( self, - fget: Callable[[Any], Any] | None = ..., - fset: Callable[[Any, Any], None] | None = ..., - fdel: Callable[[Any], None] | None = ..., + fget: Callable[[_F], _G] | None = ..., + fset: Callable[[_F, _G], None] | None = ..., + fdel: Callable[[_G], None] | None = ..., doc: str | None = ..., ) -> None: ... - def getter(self, fget: Callable[[Any], Any]) -> property: ... - def setter(self, fset: Callable[[Any, Any], None]) -> property: ... - def deleter(self, fdel: Callable[[Any], None]) -> property: ... - def __get__(self, obj: Any, type: type | None = ...) -> Any: ... - def __set__(self, obj: Any, value: Any) -> None: ... - def __delete__(self, obj: Any) -> None: ... + def getter(self, fget: Callable[[_F], _G]) -> property[_F, _G]: ... + def setter(self, fset: Callable[[_F, _G], None]) -> property[_F, _G]: ... + def deleter(self, fdel: Callable[[_G], None]) -> property[_F, _G]: ... + @overload + def __get__(self, obj: _F, type: type | None = ...) -> _G: ... + @overload + def __get__(self, obj: None, type: type | None = ...) -> property[_F, _G]: ... + def __set__(self, obj: _F, value: _G) -> None: ... + def __delete__(self, obj: _G) -> None: ... class _NotImplementedType(Any): # type: ignore # A little weird, but typing the __call__ as NotImplemented makes the error message From 67db3b7a00a9651205698ea20f41e6532f4f5858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20W=C3=B6rtwein?= Date: Tue, 31 Aug 2021 17:51:58 -0400 Subject: [PATCH 2/5] werkzeug --- stubs/Werkzeug/werkzeug/utils.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/Werkzeug/werkzeug/utils.pyi b/stubs/Werkzeug/werkzeug/utils.pyi index 5b4f507dea98..96437226db06 100644 --- a/stubs/Werkzeug/werkzeug/utils.pyi +++ b/stubs/Werkzeug/werkzeug/utils.pyi @@ -3,7 +3,7 @@ from typing import Any, Text, Type, TypeVar, overload from werkzeug._internal import _DictAccessorProperty from werkzeug.wrappers import Response -class cached_property(property): +class cached_property(property[Any, Any]): __name__: Any __module__: Any __doc__: Any From 90888d865906c55830d3aa576241f0ff061998e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20W=C3=B6rtwein?= Date: Tue, 31 Aug 2021 20:48:33 -0400 Subject: [PATCH 3/5] contra- and covariance --- stdlib/builtins.pyi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index cc5f35521854..9c4d6c99f89a 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -920,8 +920,8 @@ class range(Sequence[int]): def __repr__(self) -> str: ... def __reversed__(self) -> Iterator[int]: ... -_F = TypeVar("_F") -_G = TypeVar("_G") +_F = TypeVar("_F", contravariant=True) +_G = TypeVar("_G", covariant=True) class property(Generic[_F, _G]): fget: Callable[[_F], _G] | None @@ -941,8 +941,8 @@ class property(Generic[_F, _G]): def __get__(self, obj: _F, type: type | None = ...) -> _G: ... @overload def __get__(self, obj: None, type: type | None = ...) -> property[_F, _G]: ... - def __set__(self, obj: _F, value: _G) -> None: ... - def __delete__(self, obj: _G) -> None: ... + def __set__(self, obj: _F, value: Any) -> None: ... + def __delete__(self, obj: Any) -> None: ... class _NotImplementedType(Any): # type: ignore # A little weird, but typing the __call__ as NotImplemented makes the error message From 9251eaed80dea639831557a12ca58e3dc4e7766b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20W=C3=B6rtwein?= Date: Wed, 1 Sep 2021 09:55:13 -0400 Subject: [PATCH 4/5] Update stdlib/builtins.pyi Co-authored-by: Akuli --- stdlib/builtins.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 9c4d6c99f89a..b7ef2f31313c 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -934,9 +934,9 @@ class property(Generic[_F, _G]): fdel: Callable[[_G], None] | None = ..., doc: str | None = ..., ) -> None: ... - def getter(self, fget: Callable[[_F], _G]) -> property[_F, _G]: ... - def setter(self, fset: Callable[[_F, _G], None]) -> property[_F, _G]: ... - def deleter(self, fdel: Callable[[_G], None]) -> property[_F, _G]: ... + def getter(self: _T, fget: Callable[[_F], _G]) -> _T: ... + def setter(self: _T, fset: Callable[[_F, _G], None]) -> _T: ... + def deleter(self: _T, fdel: Callable[[_G], None]) -> _T: ... @overload def __get__(self, obj: _F, type: type | None = ...) -> _G: ... @overload From 740ac0dd43c4820a5033bba30d8b52507da6c226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20W=C3=B6rtwein?= Date: Wed, 1 Sep 2021 09:55:21 -0400 Subject: [PATCH 5/5] Update stdlib/builtins.pyi Co-authored-by: Akuli --- stdlib/builtins.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index b7ef2f31313c..7844edd65de7 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -940,7 +940,7 @@ class property(Generic[_F, _G]): @overload def __get__(self, obj: _F, type: type | None = ...) -> _G: ... @overload - def __get__(self, obj: None, type: type | None = ...) -> property[_F, _G]: ... + def __get__(self: _T, obj: None, type: type | None = ...) -> _T: ... def __set__(self, obj: _F, value: Any) -> None: ... def __delete__(self, obj: Any) -> None: ...