Прежде всего, я знаю, что такое ковариантность/инвариантность/контравариантность. Мой вопрос заключается в том, каким образом Sequence считается правильным обходным решением в экосистеме Python (проверено до 8 связанных вопросов SO).
Некоторые случайные примеры вызвать ошибку, связанную с
инвариантностью, в MyPy:
Код: Выделить всё
# Example-1
def test(words: list[str | int]) -> None:
pass
test(["foo"] + [("f" + str(x)) for x in range(0, 10)]) # ERROR
На этом этапе вывод CLI (и Pythonistas) рекомендует переключиться на Sequence, который является неизменяемым и ковариантным. Хорошо, давайте сделаем это:
Код: Выделить всё
# Example-2
from typing import Sequence
def test(words: Sequence[str | int]) -> None:
pass
test(["foo"] + [("f" + str(x)) for x in range(0, 10)]) # OK
Это решает проблему. Но тут же появляется еще один.
совместим с «xxx» (строка представляет собой последовательность символов), поэтому теперь передать строку в функцию, где ожидался список строк, стало тривиально.
может быть не так уж распространен, но это вариации list[str | SomePattern] появляется гораздо чаще. Поэтому мне интересно, почему нет лучшего обходного пути, почему эта проблема никогда не упоминается (по крайней мере, я ничего не нашел)? На мой взгляд, потеря безопасности типов без какой-либо выгоды — это плохо.
Подробнее здесь:
https://stackoverflow.com/questions/793 ... -in-python