Список против последовательности для борьбы с ковариацией в PythonPython

Программы на Python
Ответить
Anonymous
 Список против последовательности для борьбы с ковариацией в Python

Сообщение Anonymous »

Прежде всего, я знаю, что такое ковариантность/инвариантность/контравариантность. Мой вопрос заключается в том, каким образом 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
Это решает проблему. Но тут же появляется еще один.

Код: Выделить всё

Sequence[str]
совместим с «xxx» (строка представляет собой последовательность символов), поэтому теперь передать строку в функцию, где ожидался список строк, стало тривиально.

Код: Выделить всё

list[str | int]
может быть не так уж распространен, но это вариации list[str | SomePattern] появляется гораздо чаще. Поэтому мне интересно, почему нет лучшего обходного пути, почему эта проблема никогда не упоминается (по крайней мере, я ничего не нашел)? На мой взгляд, потеря безопасности типов без какой-либо выгоды — это плохо.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»