Improve protocol return types (#7093)

* Dunder comparisons must return bool.
* write() return type should be ignored.
* Use custom comparison protocols in _operator.pyi
This commit is contained in:
Sebastian Rittau
2022-02-01 08:59:07 +01:00
committed by GitHub
parent 587d15a9bc
commit 54fde0c2a1
2 changed files with 27 additions and 10 deletions

View File

@@ -1,5 +1,4 @@
import sys
from _typeshed import SupportsAnyComparison
from typing import (
Any,
AnyStr,
@@ -25,6 +24,24 @@ _K = TypeVar("_K")
_V = TypeVar("_V")
_P = ParamSpec("_P")
# The following protocols return "Any" instead of bool, since the comparison
# operators can be overloaded to return an arbitrary object. For example,
# the numpy.array comparison dunders return another numpy.array.
class _SupportsDunderLT(Protocol):
def __lt__(self, __other: Any) -> Any: ...
class _SupportsDunderGT(Protocol):
def __gt__(self, __other: Any) -> Any: ...
class _SupportsDunderLE(Protocol):
def __le__(self, __other: Any) -> Any: ...
class _SupportsDunderGE(Protocol):
def __ge__(self, __other: Any) -> Any: ...
_SupportsComparison = _SupportsDunderLE | _SupportsDunderGE | _SupportsDunderGT | _SupportsDunderLT
class _SupportsInversion(Protocol[_T_co]):
def __invert__(self) -> _T_co: ...
@@ -35,12 +52,12 @@ class _SupportsPos(Protocol[_T_co]):
def __pos__(self) -> _T_co: ...
# All four comparison functions must have the same signature, or we get false-positive errors
def lt(__a: SupportsAnyComparison, __b: SupportsAnyComparison) -> Any: ...
def le(__a: SupportsAnyComparison, __b: SupportsAnyComparison) -> Any: ...
def lt(__a: _SupportsComparison, __b: _SupportsComparison) -> Any: ...
def le(__a: _SupportsComparison, __b: _SupportsComparison) -> Any: ...
def eq(__a: object, __b: object) -> Any: ...
def ne(__a: object, __b: object) -> Any: ...
def ge(__a: SupportsAnyComparison, __b: SupportsAnyComparison) -> Any: ...
def gt(__a: SupportsAnyComparison, __b: SupportsAnyComparison) -> Any: ...
def ge(__a: _SupportsComparison, __b: _SupportsComparison) -> Any: ...
def gt(__a: _SupportsComparison, __b: _SupportsComparison) -> Any: ...
def not_(__a: object) -> bool: ...
def truth(__a: object) -> bool: ...
def is_(__a: object, __b: object) -> bool: ...

View File

@@ -38,16 +38,16 @@ class SupportsAnext(Protocol[_T_co]):
# Comparison protocols
class SupportsDunderLT(Protocol):
def __lt__(self, __other: Any) -> Any: ...
def __lt__(self, __other: Any) -> bool: ...
class SupportsDunderGT(Protocol):
def __gt__(self, __other: Any) -> Any: ...
def __gt__(self, __other: Any) -> bool: ...
class SupportsDunderLE(Protocol):
def __le__(self, __other: Any) -> Any: ...
def __le__(self, __other: Any) -> bool: ...
class SupportsDunderGE(Protocol):
def __ge__(self, __other: Any) -> Any: ...
def __ge__(self, __other: Any) -> bool: ...
class SupportsAllComparisons(SupportsDunderLT, SupportsDunderGT, SupportsDunderLE, SupportsDunderGE, Protocol): ...
@@ -181,7 +181,7 @@ class SupportsNoArgReadline(Protocol[_T_co]):
# stable
class SupportsWrite(Protocol[_T_contra]):
def write(self, __s: _T_contra) -> Any: ...
def write(self, __s: _T_contra) -> object: ...
ReadOnlyBuffer = bytes # stable
# Anything that implements the read-write buffer interface.