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.
class Proto(Protocol[T]):
attr: T
attr: T # this class is invariant, since it has a mutable attribute
var: Proto[float]
another_var: Proto[int]
@ -789,20 +789,19 @@ Changes in the typing module
The following classes in ``typing`` module will be protocols:
* ``Hashable``
* ``SupportsAbs`` (and other ``Supports*`` classes)
* ``Callable``
* ``Awaitable``
* ``Iterable``, ``Iterator``
* ``AsyncIterable``, ``AsyncIterator``
* ``Hashable``
* ``Sized``
* ``Container``
* ``Collection``
* ``Reversible``
* ``Sequence``, ``MutableSequence``
* ``AbstractSet``, ``MutableSet``
* ``Mapping``, ``MutableMapping``
* ``AsyncIterable``, ``AsyncIterator``
* ``Awaitable``
* ``Callable``
* ``ContextManager``, ``AsyncContextManager``
* ``SupportsAbs`` (and other ``Supports*`` classes)
Most of these classes are small and conceptually simple. It is easy to see
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.
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
=======================
@ -1145,6 +1177,9 @@ https://github.com/ilevkivskyi/typeshed/tree/protocols. Installation steps::
git fetch proto && git checkout proto/protocols
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
==========