List[Foo] + List[Bar] now returns List[Foo | Bar] (#8293)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Akuli
2022-07-15 20:20:50 +03:00
committed by GitHub
parent 0764f9f31f
commit 3c90c97b9a
2 changed files with 24 additions and 1 deletions

View File

@@ -986,8 +986,12 @@ class list(MutableSequence[_T], Generic[_T]):
@overload
def __setitem__(self, __s: slice, __o: Iterable[_T]) -> None: ...
def __delitem__(self, __i: SupportsIndex | slice) -> None: ...
# Overloading looks unnecessary, but is needed to work around complex mypy problems
@overload
def __add__(self, __x: list[_T]) -> list[_T]: ...
def __iadd__(self: Self, __x: Iterable[_T]) -> Self: ...
@overload
def __add__(self, __x: list[_S]) -> list[_S | _T]: ...
def __iadd__(self: Self, __x: Iterable[_T]) -> Self: ... # type: ignore[misc]
def __mul__(self, __n: SupportsIndex) -> list[_T]: ...
def __rmul__(self, __n: SupportsIndex) -> list[_T]: ...
def __imul__(self: Self, __n: SupportsIndex) -> Self: ...

View File

@@ -0,0 +1,19 @@
from typing import List, Union
from typing_extensions import assert_type
# list.__add__ example from #8292
class Foo:
def asd(self) -> int:
return 1
class Bar:
def asd(self) -> int:
return 2
combined = [Foo()] + [Bar()]
assert_type(combined, List[Union[Foo, Bar]])
for item in combined:
assert_type(item.asd(), int)