Few more updates to PEP 544: Protocols (#246)

* Drop Set's from protocols; add adapters to rejected ideas

* Add link to runtime implementation
This commit is contained in:
Ivan Levkivskyi 2017-04-28 01:06:36 +02:00 committed by Brett Cannon
parent a7e294d3b4
commit ea2cd1593b
1 changed files with 42 additions and 7 deletions

View File

@ -527,7 +527,7 @@ inferred from a protocol definition. Examples::
new_sender = sender # OK, type checker finds that 'Sender' is contravariant. new_sender = sender # OK, type checker finds that 'Sender' is contravariant.
class Proto(Protocol[T]): class Proto(Protocol[T]):
attr: T attr: T # this class is invariant, since it has a mutable attribute
var: Proto[float] var: Proto[float]
another_var: Proto[int] another_var: Proto[int]
@ -789,20 +789,19 @@ Changes in the typing module
The following classes in ``typing`` module will be protocols: The following classes in ``typing`` module will be protocols:
* ``Hashable`` * ``Callable``
* ``SupportsAbs`` (and other ``Supports*`` classes) * ``Awaitable``
* ``Iterable``, ``Iterator`` * ``Iterable``, ``Iterator``
* ``AsyncIterable``, ``AsyncIterator``
* ``Hashable``
* ``Sized`` * ``Sized``
* ``Container`` * ``Container``
* ``Collection`` * ``Collection``
* ``Reversible`` * ``Reversible``
* ``Sequence``, ``MutableSequence`` * ``Sequence``, ``MutableSequence``
* ``AbstractSet``, ``MutableSet``
* ``Mapping``, ``MutableMapping`` * ``Mapping``, ``MutableMapping``
* ``AsyncIterable``, ``AsyncIterator``
* ``Awaitable``
* ``Callable``
* ``ContextManager``, ``AsyncContextManager`` * ``ContextManager``, ``AsyncContextManager``
* ``SupportsAbs`` (and other ``Supports*`` classes)
Most of these classes are small and conceptually simple. It is easy to see Most of these classes are small and conceptually simple. It is easy to see
what are the methods these protocols implement, and immediately recognize what are the methods these protocols implement, and immediately recognize
@ -1119,6 +1118,39 @@ This was rejected for the following reasons:
it has an unsafe override. it has an unsafe override.
Support adapters and adaptation
-------------------------------
Adaptation was proposed by PEP 246 (rejected) and is supported by
``zope.interface``, see https://docs.zope.org/zope.interface/adapter.html.
Adapters is quite an advanced concept, and PEP 484 supports unions and
generic aliases that can be used instead of adapters. This can be illustrated
with an example of ``Iterable`` protocol, there is another way of supporting
iteration by providing ``__getitem__`` and ``__len__``. If a function
supports both this way and the now standard ``__iter__`` method, then it could
be annotated by a union type::
class OldIterable(Sized, Protocol[T]):
def __getitem__(self, item: int) -> T: ...
CompatIterable = Union[Iterable[T], OldIterable[T]]
class A:
def __iter__(self) -> Iterator[str]: ...
class B:
def __len__(self) -> int: ...
def __getitem__(self, item: int) -> str: ...
def iterate(it: CompatIterable[str]) -> None:
...
iterate(A()) # OK
iterate(B()) # OK
Since there is a reasonable alternative for such cases with existing tooling,
it is therefore proposed not to include adaptation in this PEP.
Backwards Compatibility Backwards Compatibility
======================= =======================
@ -1145,6 +1177,9 @@ https://github.com/ilevkivskyi/typeshed/tree/protocols. Installation steps::
git fetch proto && git checkout proto/protocols git fetch proto && git checkout proto/protocols
cd .. && git add typeshed && sudo python3 -m pip install -U . cd .. && git add typeshed && sudo python3 -m pip install -U .
The runtime implementation of protocols in ``typing`` module is
found at https://github.com/ilevkivskyi/typehinting/tree/protocols.
References References
========== ==========