Список Union of Generi c работает не так, как я ожидал - PullRequest
0 голосов
/ 02 августа 2020

Итак, у меня есть функция, которая принимает либо список ob js, либо один obj и возвращает список.

Вот как это выглядит:

from typing import Union, List, TypeVar, Type

T = TypeVar('T')


def to_list(obj_type: Type[T], obj_or_list: Union[List[T], T]) -> List[T]:
    ...

Это отлично работает, если я передаю строку. например,

result: List[str] = to_list(str, "hi")

, но не работает (ошибка проверки типа через pyright), когда я передаю список str (или список любых объектов), например

input_data: List[str] = ["hi"]
result: List[str] = to_list(str,input_data)

Вот сообщение об ошибке

Выражение типа «List [str | List [str]]» не может быть присвоено объявленному типу «List [str]»

Похоже, проверка типов (pyright) думает, что to_list возвращает List[Union[List[str],str]] вместо просто List[str].

В основном вместо того, чтобы интерпретировать T как str, он интерпретировал T as Union[List[str], str], что немного раздражает, потому что я предположил, что было бы достаточно умен, чтобы определить, что T является str, потому что я явно передал str как obj_type.

Мои два вопроса:

  • есть ли способ добиться того, чего я хочу? в основном это функция, которая принимает либо список объектов, либо один объект и возвращает список объектов (при сохранении подсказок типа). Мой текущий обходной путь:
from typing import Union, List, TypeVar, Type

T = TypeVar('T')


def to_list(obj_type: Type[T], obj_or_list: Any) -> List[T]:
    ...
  • Is есть ли техническое имя для определения способа разрешения параметра generi c? Чтобы я мог поискать и узнать об этом?
    • например. В принципе, если я передаю List[str] параметру с типом Union[List[T],T], тогда есть две возможности:
      • T это List[str]
      • T - это str,
    • Я хочу знать, есть ли конкретное / академическое / техническое название для процесса определения того, что T такое

1 Ответ

0 голосов
/ 02 августа 2020
  • Частичный ответ на мой второй вопрос: техническое название этого процесса известно как сопоставление TypeVar (иногда также называемое TypeVar «решение»). соответствующая ссылка: https://github.com/microsoft/pyright/issues/910#issuecomment -667553334
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...