Выбор общего базового класса элементов списка (выбор соединения) вместо объединения элементов - это сознательный выбор дизайна, сделанный mypy.
Короче говоря, проблема в том, что независимо от того, какое из двух решений вы выберете, вы всегда будете сталкиваться с крайними случаями, которые в конечном итоге кому-то будут неудобны. Например, вывести объединение было бы неудобно в следующих случаях, когда вы хотите изменить или добавить в список, а не только читать его:
class Parent: pass
class Child1(Parent): pass
class Child2(Parent): pass
class Child3(Parent): pass
# If foo is inferred to be type List[Union[Child1, Child2]] instead of List[Parent]
foo = [Child1(), Child2()]
# ...then this will fail with a type error, which is annoying.
foo.append(Child3())
Возможно, mypy может попытаться применить какую-нибудь умную эвристику, чтобы определить, следует ли выводить соединение или объединение, но это, вероятно, в конечном итоге будет довольно запутанным и трудно предсказуемым для конечных пользователей.
Это также довольно простая проблема, которую можно обойти на практике - например, вы можете просто добавить явную аннотацию к своей переменной:
from typing import Union, Sized, List
# If you want the union
xs: List[Union[int, str]] = [1, "1"]
# If you want any object with the `__len__` method
ys: List[Sized] = [1, "1"]
Итак, учитывая эти два фактора, реализация какой-нибудь причудливой эвристики или полное переключение на вывод объединений (и нарушение большого количества существующего кода) на самом деле не стоит того.
person
Michael0x2a
schedule
12.08.2019