[Python-Dev] PEP 484 -- proposal to allow @overload in non-stub files

Guido van Rossum guido at python.org
Wed Oct 21 18:58:17 EDT 2015


PEP 484 (Type Hinting) currently disallows @overload outside stub files.
The hope was that a PEP for multi-dispatch would emerge, but that's been
slow coming.

Meanwhile, over in https://github.com/ambv/typehinting/issues/72 a proposal
has emerged to allow @overload in regular modules, as long as it is
followed by a non-overloaded definition that serves as the
default/fallback. A motivating example is __getitem__, which is often
overloaded for item access and slicing.

In stubs, you can use:

class Foo(Generic[T]):
    @overload
    def __getitem__(self, i: int) -> T: ...
    @overload
    def __getitem__(self, s: slice) -> Foo[T]: ...

(Note that the '...' are part of the actual code -- an ellipsis is how you
represent the body of all functions in stub files.)

However, in source files the best you can do is:

class Foo(Generic[T]):
    def __getitem__(self, i: Union[int, slice]) -> Union[T, List[T]]: ...

which will require unacceptable casts at every call site. You can work
around it by having a stub file but that's cumbersome if this is the only
reason to have one.

The proposal is to allow this to be written as follows in implementation
(non-stub) modules:

class Foo(Generic[T]):
    @overload
    def __getitem__(self, i: int) -> T: ...
    @overload
    def __getitem__(self, s: slice) -> Foo[T]: ...
    def __getitem__(self, x):
        <actual implementation goes here>

The actual implementation must be last, so at run time it will override the
definition. It has to use isinstance() to distinguish the cases. A type
checker would have to recognize this as a special case (so as not to
complain about the non-overloaded version). Jukka thinks it would be about
a day's work to implement in mypy; the work in typing.py would be a few
minutes.

Thoughts?

--
--Guido van Rossum (python.org/~guido)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20151021/8eaa40d3/attachment.html>


More information about the Python-Dev mailing list