简短回答:不存在协变可变集合,此处列出了处理这种情况的可能策略https://mypy.readthedocs.io/en/stable/common_issues.html#invariance-vs-covariance
为什么可变集合不能协变?
因为这会导致严重的问题,例如:
def make_first_None(numbers_or_nones: MutableSequence[Optional[int]]):
numbers_or_nones[0] = None
numbers: List[int] = [1, 2, 3, 4]
make_first_None(numbers) # Error!! Numbers is not a List[int] anymore!!!
关于为什么可变集合必须不变的更长的解释在这里https://mypy.readthedocs.io/en/stable/generics.html#variance-of-generics
对于这种情况,文档中列出的三种策略如下所示:
numbers: List[Optional[int]] = [1, 2, 3, 4]
print_it(numbers)
print_it(list(numbers))
def print_it(numbers_or_nones: Sequence[Optional[int]]) -> List[int]:
for number in numbers:
if number is None:
print("NOOOO")
else:
print(number)
return [number or 0 for number in numbers]
numbers = [1, 2, 3, 4]
print_it(numbers)