Skip to content

Commit 24827c4

Browse files
Made parameters of collections.abc members positional only (#15305)
1 parent b43fc8f commit 24827c4

File tree

3 files changed

+79
-61
lines changed

3 files changed

+79
-61
lines changed

stdlib/@tests/stubtest_allowlists/common.txt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,26 @@ _collections_abc\.ByteString
204204
typing\.ByteString
205205

206206
_collections_abc.Callable # Typing-related weirdness
207-
_collections_abc.Mapping.get # Adding None to the Union messed up mypy
208-
_collections_abc.Sequence.index # Supporting None in end is not mandatory
207+
208+
# While the implementation in _collections_abc.py uses positional-or-keyword args,
209+
# this is unsafe as canonical types list/dict/set etc. only support positional args.
210+
# See: https://github.com/python/typeshed/issues/14071
211+
# See: https://github.com/python/cpython/issues/135312
212+
_collections_abc.Mapping.get
213+
_collections_abc.MutableSequence.append
214+
_collections_abc.MutableSequence.extend
215+
_collections_abc.MutableSequence.insert
216+
_collections_abc.MutableSequence.pop
217+
_collections_abc.MutableSequence.remove
218+
_collections_abc.MutableSet.add
219+
_collections_abc.MutableSet.discard
220+
_collections_abc.MutableSet.remove
221+
_collections_abc.Sequence.count
222+
_collections_abc.Sequence.index
223+
_collections_abc.Set.isdisjoint
224+
_collections_abc.Set._from_iterable
225+
_collections_abc.ItemsView._from_iterable
226+
_collections_abc.KeysView._from_iterable
209227

210228
_ctypes.CFuncPtr # stubtest erroneously thinks it can't be subclassed
211229

stdlib/abc.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ class ABCMeta(type):
2222
mcls: type[_typeshed.Self], name: str, bases: tuple[type, ...], namespace: dict[str, Any], **kwargs: Any
2323
) -> _typeshed.Self: ...
2424

25-
def __instancecheck__(cls: ABCMeta, instance: Any) -> bool: ...
26-
def __subclasscheck__(cls: ABCMeta, subclass: type) -> bool: ...
25+
def __instancecheck__(cls: ABCMeta, instance: Any, /) -> bool: ...
26+
def __subclasscheck__(cls: ABCMeta, subclass: type, /) -> bool: ...
2727
def _dump_registry(cls: ABCMeta, file: SupportsWrite[str] | None = None) -> None: ...
2828
def register(cls: ABCMeta, subclass: type[_T]) -> type[_T]: ...
2929

stdlib/typing.pyi

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -658,78 +658,78 @@ class Collection(Iterable[_T_co], Container[Any], Protocol[_T_co]):
658658
class Sequence(Reversible[_T_co], Collection[_T_co]):
659659
@overload
660660
@abstractmethod
661-
def __getitem__(self, index: int) -> _T_co: ...
661+
def __getitem__(self, index: int, /) -> _T_co: ...
662662
@overload
663663
@abstractmethod
664-
def __getitem__(self, index: slice[int | None]) -> Sequence[_T_co]: ...
664+
def __getitem__(self, index: slice[int | None], /) -> Sequence[_T_co]: ...
665665
# Mixin methods
666-
def index(self, value: Any, start: int = 0, stop: int = ...) -> int: ...
667-
def count(self, value: Any) -> int: ...
668-
def __contains__(self, value: object) -> bool: ...
666+
def index(self, value: Any, start: int = 0, stop: int = ..., /) -> int: ...
667+
def count(self, value: Any, /) -> int: ...
668+
def __contains__(self, value: object, /) -> bool: ...
669669
def __iter__(self) -> Iterator[_T_co]: ...
670670
def __reversed__(self) -> Iterator[_T_co]: ...
671671

672672
class MutableSequence(Sequence[_T]):
673673
@abstractmethod
674-
def insert(self, index: int, value: _T) -> None: ...
674+
def insert(self, index: int, value: _T, /) -> None: ...
675675
@overload
676676
@abstractmethod
677-
def __getitem__(self, index: int) -> _T: ...
677+
def __getitem__(self, index: int, /) -> _T: ...
678678
@overload
679679
@abstractmethod
680-
def __getitem__(self, index: slice[int | None]) -> MutableSequence[_T]: ...
680+
def __getitem__(self, index: slice[int | None], /) -> MutableSequence[_T]: ...
681681
@overload
682682
@abstractmethod
683-
def __setitem__(self, index: int, value: _T) -> None: ...
683+
def __setitem__(self, index: int, value: _T, /) -> None: ...
684684
@overload
685685
@abstractmethod
686-
def __setitem__(self, index: slice[int | None], value: Iterable[_T]) -> None: ...
686+
def __setitem__(self, index: slice[int | None], value: Iterable[_T], /) -> None: ...
687687
@overload
688688
@abstractmethod
689-
def __delitem__(self, index: int) -> None: ...
689+
def __delitem__(self, index: int, /) -> None: ...
690690
@overload
691691
@abstractmethod
692-
def __delitem__(self, index: slice[int | None]) -> None: ...
692+
def __delitem__(self, index: slice[int | None], /) -> None: ...
693693
# Mixin methods
694-
def append(self, value: _T) -> None: ...
694+
def append(self, value: _T, /) -> None: ...
695695
def clear(self) -> None: ...
696-
def extend(self, values: Iterable[_T]) -> None: ...
696+
def extend(self, values: Iterable[_T], /) -> None: ...
697697
def reverse(self) -> None: ...
698-
def pop(self, index: int = -1) -> _T: ...
699-
def remove(self, value: _T) -> None: ...
700-
def __iadd__(self, values: Iterable[_T]) -> typing_extensions.Self: ...
698+
def pop(self, index: int = -1, /) -> _T: ...
699+
def remove(self, value: _T, /) -> None: ...
700+
def __iadd__(self, values: Iterable[_T], /) -> typing_extensions.Self: ...
701701

702702
class AbstractSet(Collection[_T_co]):
703703
@abstractmethod
704-
def __contains__(self, x: object) -> bool: ...
704+
def __contains__(self, x: object, /) -> bool: ...
705705
def _hash(self) -> int: ...
706706
# Mixin methods
707707
@classmethod
708-
def _from_iterable(cls, it: Iterable[_S]) -> AbstractSet[_S]: ...
709-
def __le__(self, other: AbstractSet[Any]) -> bool: ...
710-
def __lt__(self, other: AbstractSet[Any]) -> bool: ...
711-
def __gt__(self, other: AbstractSet[Any]) -> bool: ...
712-
def __ge__(self, other: AbstractSet[Any]) -> bool: ...
713-
def __and__(self, other: AbstractSet[Any]) -> AbstractSet[_T_co]: ...
714-
def __or__(self, other: AbstractSet[_T]) -> AbstractSet[_T_co | _T]: ...
715-
def __sub__(self, other: AbstractSet[Any]) -> AbstractSet[_T_co]: ...
716-
def __xor__(self, other: AbstractSet[_T]) -> AbstractSet[_T_co | _T]: ...
717-
def __eq__(self, other: object) -> bool: ...
718-
def isdisjoint(self, other: Iterable[Any]) -> bool: ...
708+
def _from_iterable(cls, it: Iterable[_S], /) -> AbstractSet[_S]: ...
709+
def __le__(self, other: AbstractSet[Any], /) -> bool: ...
710+
def __lt__(self, other: AbstractSet[Any], /) -> bool: ...
711+
def __gt__(self, other: AbstractSet[Any], /) -> bool: ...
712+
def __ge__(self, other: AbstractSet[Any], /) -> bool: ...
713+
def __and__(self, other: AbstractSet[Any], /) -> AbstractSet[_T_co]: ...
714+
def __or__(self, other: AbstractSet[_T], /) -> AbstractSet[_T_co | _T]: ...
715+
def __sub__(self, other: AbstractSet[Any], /) -> AbstractSet[_T_co]: ...
716+
def __xor__(self, other: AbstractSet[_T], /) -> AbstractSet[_T_co | _T]: ...
717+
def __eq__(self, other: object, /) -> bool: ...
718+
def isdisjoint(self, other: Iterable[Any], /) -> bool: ...
719719

720720
class MutableSet(AbstractSet[_T]):
721721
@abstractmethod
722-
def add(self, value: _T) -> None: ...
722+
def add(self, value: _T, /) -> None: ...
723723
@abstractmethod
724-
def discard(self, value: _T) -> None: ...
724+
def discard(self, value: _T, /) -> None: ...
725725
# Mixin methods
726726
def clear(self) -> None: ...
727727
def pop(self) -> _T: ...
728-
def remove(self, value: _T) -> None: ...
729-
def __ior__(self, it: AbstractSet[_T]) -> typing_extensions.Self: ... # type: ignore[override,misc]
730-
def __iand__(self, it: AbstractSet[Any]) -> typing_extensions.Self: ...
731-
def __ixor__(self, it: AbstractSet[_T]) -> typing_extensions.Self: ... # type: ignore[override,misc]
732-
def __isub__(self, it: AbstractSet[Any]) -> typing_extensions.Self: ...
728+
def remove(self, value: _T, /) -> None: ...
729+
def __ior__(self, it: AbstractSet[_T], /) -> typing_extensions.Self: ... # type: ignore[override,misc]
730+
def __iand__(self, it: AbstractSet[Any], /) -> typing_extensions.Self: ...
731+
def __ixor__(self, it: AbstractSet[_T], /) -> typing_extensions.Self: ... # type: ignore[override,misc]
732+
def __isub__(self, it: AbstractSet[Any], /) -> typing_extensions.Self: ...
733733

734734
class MappingView(Sized):
735735
__slots__ = ("_mapping",)
@@ -739,36 +739,36 @@ class MappingView(Sized):
739739
class ItemsView(MappingView, AbstractSet[tuple[_KT_co, _VT_co]], Generic[_KT_co, _VT_co]):
740740
def __init__(self, mapping: SupportsGetItemViewable[_KT_co, _VT_co]) -> None: ... # undocumented
741741
@classmethod
742-
def _from_iterable(cls, it: Iterable[_S]) -> set[_S]: ...
743-
def __and__(self, other: Iterable[Any]) -> set[tuple[_KT_co, _VT_co]]: ...
744-
def __rand__(self, other: Iterable[_T]) -> set[_T]: ...
745-
def __contains__(self, item: tuple[object, object]) -> bool: ... # type: ignore[override]
742+
def _from_iterable(cls, it: Iterable[_S], /) -> set[_S]: ...
743+
def __and__(self, other: Iterable[Any], /) -> set[tuple[_KT_co, _VT_co]]: ...
744+
def __rand__(self, other: Iterable[_T], /) -> set[_T]: ...
745+
def __contains__(self, item: tuple[object, object], /) -> bool: ... # type: ignore[override]
746746
def __iter__(self) -> Iterator[tuple[_KT_co, _VT_co]]: ...
747-
def __or__(self, other: Iterable[_T]) -> set[tuple[_KT_co, _VT_co] | _T]: ...
748-
def __ror__(self, other: Iterable[_T]) -> set[tuple[_KT_co, _VT_co] | _T]: ...
749-
def __sub__(self, other: Iterable[Any]) -> set[tuple[_KT_co, _VT_co]]: ...
750-
def __rsub__(self, other: Iterable[_T]) -> set[_T]: ...
751-
def __xor__(self, other: Iterable[_T]) -> set[tuple[_KT_co, _VT_co] | _T]: ...
752-
def __rxor__(self, other: Iterable[_T]) -> set[tuple[_KT_co, _VT_co] | _T]: ...
747+
def __or__(self, other: Iterable[_T], /) -> set[tuple[_KT_co, _VT_co] | _T]: ...
748+
def __ror__(self, other: Iterable[_T], /) -> set[tuple[_KT_co, _VT_co] | _T]: ...
749+
def __sub__(self, other: Iterable[Any], /) -> set[tuple[_KT_co, _VT_co]]: ...
750+
def __rsub__(self, other: Iterable[_T], /) -> set[_T]: ...
751+
def __xor__(self, other: Iterable[_T], /) -> set[tuple[_KT_co, _VT_co] | _T]: ...
752+
def __rxor__(self, other: Iterable[_T], /) -> set[tuple[_KT_co, _VT_co] | _T]: ...
753753

754754
class KeysView(MappingView, AbstractSet[_KT_co]):
755755
def __init__(self, mapping: Viewable[_KT_co]) -> None: ... # undocumented
756756
@classmethod
757-
def _from_iterable(cls, it: Iterable[_S]) -> set[_S]: ...
758-
def __and__(self, other: Iterable[Any]) -> set[_KT_co]: ...
759-
def __rand__(self, other: Iterable[_T]) -> set[_T]: ...
760-
def __contains__(self, key: object) -> bool: ...
757+
def _from_iterable(cls, it: Iterable[_S], /) -> set[_S]: ...
758+
def __and__(self, other: Iterable[Any], /) -> set[_KT_co]: ...
759+
def __rand__(self, other: Iterable[_T], /) -> set[_T]: ...
760+
def __contains__(self, key: object, /) -> bool: ...
761761
def __iter__(self) -> Iterator[_KT_co]: ...
762-
def __or__(self, other: Iterable[_T]) -> set[_KT_co | _T]: ...
763-
def __ror__(self, other: Iterable[_T]) -> set[_KT_co | _T]: ...
764-
def __sub__(self, other: Iterable[Any]) -> set[_KT_co]: ...
765-
def __rsub__(self, other: Iterable[_T]) -> set[_T]: ...
766-
def __xor__(self, other: Iterable[_T]) -> set[_KT_co | _T]: ...
767-
def __rxor__(self, other: Iterable[_T]) -> set[_KT_co | _T]: ...
762+
def __or__(self, other: Iterable[_T], /) -> set[_KT_co | _T]: ...
763+
def __ror__(self, other: Iterable[_T], /) -> set[_KT_co | _T]: ...
764+
def __sub__(self, other: Iterable[Any], /) -> set[_KT_co]: ...
765+
def __rsub__(self, other: Iterable[_T], /) -> set[_T]: ...
766+
def __xor__(self, other: Iterable[_T], /) -> set[_KT_co | _T]: ...
767+
def __rxor__(self, other: Iterable[_T], /) -> set[_KT_co | _T]: ...
768768

769769
class ValuesView(MappingView, Collection[_VT_co]):
770770
def __init__(self, mapping: SupportsGetItemViewable[Any, _VT_co]) -> None: ... # undocumented
771-
def __contains__(self, value: object) -> bool: ...
771+
def __contains__(self, value: object, /) -> bool: ...
772772
def __iter__(self) -> Iterator[_VT_co]: ...
773773

774774
# note for Mapping.get and MutableMapping.pop and MutableMapping.setdefault

0 commit comments

Comments
 (0)