Итак, у меня есть функция, которая принимает либо список 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
такое