Skip to content

False positive for @overload and type variable #5407

Closed
@mxr

Description

@mxr

This issue seems similar to #4619. My environment:

$ python --version
Python 3.6.5
$ mypy --version
mypy 0.620

Example file:

from random import random
from typing import Optional
from typing import overload
from typing import TypeVar

T = TypeVar("T")


@overload
def sometimes(o: T, o2: T) -> T:
    pass


@overload
def sometimes(o: None, o2: T) -> Optional[T]:
    pass


def sometimes(o: Optional[T], o2: T) -> Optional[T]:
    if o is not None:
        return o

    return None if random() < 0.5 else o2

mypy fails with:

$ mypy example.py
example.py:15: error: Overloaded function signature 2 will never be matched: signature 1's parameter type(s) are the same or broader

If I replace T with an explicit type such as List[str]

--- example.py	2018-07-31 18:19:45.000000000 -0400
+++ example-explicit.py	2018-07-31 18:19:47.000000000 -0400
@@ -1,22 +1,20 @@
 from random import random
+from typing import List
 from typing import Optional
 from typing import overload
-from typing import TypeVar
-
-T = TypeVar("T")
 
 
 @overload
-def sometimes(o: T, o2: T) -> T:
+def sometimes(o: List[str], o2: List[str]) -> List[str]:
     pass
 
 
 @overload
-def sometimes(o: None, o2: T) -> Optional[T]:
+def sometimes(o: None, o2: List[str]) -> Optional[List[str]]:
     pass
 
 
-def sometimes(o: Optional[T], o2: T) -> Optional[T]:
+def sometimes(o: Optional[List[str]], o2: List[str]) -> Optional[List[str]]:
     if o is not None:
         return o
 

then mypy passes

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions