Можно ли использовать Python TypeAliases или аннотированные объекты в дженериках?Python

Программы на Python
Ответить
Anonymous
 Можно ли использовать Python TypeAliases или аннотированные объекты в дженериках?

Сообщение Anonymous »

Учитывайте следующее:

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

import pydantic

def buildTypeAdapter[T](cls: type[T]) -> pydantic.TypeAdapter[T]:
return pydantic.TypeAdapter(cls)

ta1 = buildTypeAdapter(list[str]) # GOOD: pyright sees this as a TypeAdapter[list[str]]
out1 = ta1.validate_python(None)  # GOOD: pyright sees this as a list[str]
Теперь сравните со следующим:

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

type ListOfStrings = list[str]
ta2 = buildTypeAdapter(ListOfStrings)
out2 = ta2.validate_python(None)
Не удалось проверить:

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

error: Argument of type "ListOfStrings" cannot be assigned to parameter "cls" of type "type[T@buildTypeAdapter]" in function "buildTypeAdapter"
  Type "TypeAliasType" is incompatible with type "type[T@buildTypeAdapter]" (reportArgumentType)
...и он видит ta2 как тип TypeAdapter[Unknown], а out2 как Unknown.

Похожая проблема существует с:

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

ta3 = buildTypeAdapter(Annotated[list[str], "Testing"])
где сообщается:

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

error: Argument of type "type[Annotated]" cannot be assigned to parameter "cls" of type "type[T@buildTypeAdapter]" in function "buildTypeAdapter"
...и соответственно рассматривает объект как TypeAdapter[Unknown]. (Кстати, ta3 = pydantic.TypeAdapter(Annotated[list[str], "Foobar"]) сам по себе также рассматривается как TypeAdapter[Unknown], даже несмотря на то, что он не выдает ошибку о несоответствии сигнатуре вызова).

Я пробовал что-то вроде:

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

def buildTypeAdapter[T](cls: Annotated[T, ...]) -> pydantic.TypeAdapter[T]:
return pydantic.TypeAdapter(cls)
или

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

def buildTypeAdapter[T](cls: TypeAliasType[T]) -> pydantic.TypeAdapter[T]:
return pydantic.TypeAdapter(cls)
но они не поддерживаются. Существуют ли эквиваленты, которые работают должным образом?

(Обратите внимание, что Pydantic используется здесь как готовый и широко известный пример, но вопрос не об этом как таковом. Скорее, основное внимание уделяется предоставлению информации о типах статическим средствам проверки для Python - и в частности для пирайта - которые "достигают" псевдонимов типов и аннотаций, когда описание связи между аргументами и возвратом типы).

Подробнее здесь: https://stackoverflow.com/questions/791 ... n-generics
Ответить

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

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

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

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

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