Protocol: Supports Less Tham
A PEP 544 protocol to support type hints for functions that depend on items
implementing __lt__—any function that relies on sorting, for example.
class _SupportsLessThan(Protocol):
def __lt__(self, other: Any) -> bool: ...
_T = TypeVar('_T')
_T1 = TypeVar('_T1')
_LT = TypeVar('_LT', bound=_SupportsLessThan)
@overload
def sorted(__it: Iterable[_LT], *,
key: None = ...,
reverse: bool = ...) -> List[_LT]: ...
@overload
def sorted(__it: Iterable[_T], *,
key: Callable[[_T], _LT] = ...,
reverse: bool = ...) -> List[_T]: ...
| hint |
prevents bug |
| it: Iterable[_T] |
it is not iterable |
| it: Iterable[_LT] |
_LT doesn't implement __lt__ |
| key: Optional[Callable[[_T], _LT]] |
key is not callable or None |
|
key is callable with arity ≠ 1 |
|
key returns type that doesn't implement __lt__ |
def sorted(__it: Iterable[_T], *,
cmp: Optional[Callable[[_T, _T1]], float] = ...,
key: Optional[Callable[[_T], Any]] = ...,
reverse: bool = ...) -> List[_T]: ...
| hint |
prevents bug |
| it: Iterable[_T] |
it is not iterable |
| cmp: Callable[[_T, _T1], float] |
cmp is not callable |
|
cmp is callable with arity ≠ 2 |
|
cmp does not return float |
| key: Callable[[_T], Any]] |
key is not callable |
|
key is callable with arity ≠ 1 |
class list(MutableSequence[_T], Generic[_T]):
...
@overload
def sort(self: List[_LT], *,
key: None = ...,
reverse: bool = ...) -> List[_LT]: ...
@overload
def sort(self, *,
key: Callable[[_T], _LT] = ...,
reverse: bool = ...) -> List[_T]: ...
| hint |
prevents bug |
test |
| self: List[_LT] |
_LT doesn't implement __lt__ |
test_sort_items_dont_support_less_than_py3 |
| key: Callable[[_T], _LT]] |
key is not callable |
test_sort_key_not_callable |
|
key is callable with arity ≠ 1 |
test_sort_key_wrong_arity |
|
key returns type that doesn't implement __lt__ |
test_sort_bad_key_return_py3 |
class list(MutableSequence[_T], Generic[_T]):
...
def sort(self, *,
cmp: Optional[Callable[[_T, _T1]], float] = ...,
key: Optional[Callable[[_T], Any]] = ...,
reverse: bool = ...) -> List[_T]: ...
| hint |
prevents bug |
test |
| cmp: Optional[Callable[[_T, _T1], float]] |
cmp is not callable or None |
|
|
cmp is callable with arity ≠ 2 |
test_sort_list_str_bad_cmp_arity_py2 |
|
cmp does not return float |
|
| key: Optional[Callable[[_T], Any]] |
key is not callable or None |
|
|
key is callable with arity ≠ 1 |
|