New submission from Crusader Ky <crusade...@gmail.com>:

An exceedingly common pattern in many Python libraries is for a function to 
accept either a string or a list of strings, and change the function output 
accordingly.

This however does not play nice with @typing.overload, as a str variable is 
also an Iterable[str] that yields individual characters; a bytes variable is 
also an Iterable[bytes].

The example below confuses tools like mypy:

@overload
def f(x: str) -> int
   ...

@overload
def f(x: Iterable[str]) -> List[int]
   ...

def f(x):
    if isinstance(x, str):
        return len(x)
    return [len(i) for i in x]


mypy output:

error: Overloaded function signatures 1 and 2 overlap with incompatible return 
types


The proposed solution is to modify PEP484 to specify that, in case of 
ambiguity, whatever overloaded typing is defined first wins. This would be 
coherent with the behaviour of @functools.singledispatch.

----------
components: Library (Lib)
messages: 339610
nosy: Crusader Ky
priority: normal
severity: normal
status: open
title: PEP484 @overload vs. str/bytes
type: behavior
versions: Python 3.5, Python 3.6, Python 3.7

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue36555>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to