Я сократил код, который я действительно хочу аннотировать для этой минимальной версии:
def print_it(numbers_or_nones):
for i, number in enumerate(numbers_or_nones):
if number is None:
numbers_or_nones[i] = 0
print("NOOOO")
else:
print(number)
numbers = [1, 2, 3, 4]
print_it(numbers)
Я хочу аннотировать параметр numbers_or_nones
из print_it
. Он должен быть ...
- ... универсальным c типом, где элементы
Optional[int]
- ... итерируемые
- .. . support индексированное присвоение
Какой правильный тип для этого случая? Обратите внимание, что изменить тип numbers : List[int]
невозможно. Единственный вариант, который я вижу, - это использовать typing.overload
.
List
Самый простой вариант - List[Optional[int]]
. Однако это дает:
error: Argument 1 to "print_it" has incompatible type "List[int]"; expected "List[Optional[int]]"
note: "List" is invariant -- see http://mypy.readthedocs.io/en/latest/common_issues.html#variance
note: Consider using "Sequence" instead, which is covariant
Последовательность
Unsupported target for indexed assignment ("Sequence[Optional[int]]")
MutableSequence
error: Argument 1 to "print_it" has incompatible type "List[int]"; expected "MutableSequence[Optional[int]]"