Правильно распространяйте объединения между контейнерами с помощью Pyright.Python

Программы на Python
Ответить
Anonymous
 Правильно распространяйте объединения между контейнерами с помощью Pyright.

Сообщение Anonymous »

Вывод типа Пайрайта, похоже, не способен преобразовать объединения однородных последовательностей, например из Union[tuple[A, ...], tuple[B, ...]] в Union[list[A], list].
Предположим, функция, которая принимает в качестве входных данных Iterable[int] или Iterable[str], пытается создать все элементы и сохранить их в памяти как список[int] или список[str]:

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

from typing import Union, TypeAlias
from collections.abc import Iterable

Items: TypeAlias = Union[Iterable[int], Iterable[str]]

def process_items(items: Items) -> None:
item_sequence: Union[list[int], list[str]] = list(items)
но Pyright перемещает Union внутри списка, выводя list[Union[int, str]] вместо Union[list[int], list[str]]:

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

Type "list[int | str]" is not assignable to declared type "list[int] | list[str]"
Type "list[int | str]" is not assignable to type "list[int] | list[str]"
"list[int | str]" is not assignable to "list[int]"
Type parameter "_T@list" is invariant, but "int | str" is not the same as "int"
Как правильно осуществить такое преобразование, сохранив информацию об однородности последовательности? Или это просто ограничение системы типов?

Подробнее здесь: https://stackoverflow.com/questions/798 ... th-pyright
Ответить

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

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

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

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

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