Псевдоним типа для типа typevar и mypyPython

Программы на Python
Ответить
Anonymous
 Псевдоним типа для типа typevar и mypy

Сообщение Anonymous »

У меня есть тип var, который представляет дочерний элемент определенного интерфейса

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

BuildableChild = TypeVar("BuildableChild", bound=Buildable)
Содержимое Buildable на самом деле не имеет значения, давайте предположим, что это просто

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

class Buildable: ...
Теперь я хочу иметь функцию, которая принимает класс этого типа (т.е. дочерний класс) и необязательную функцию фильтра, которая также принимает сборный класс:

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

def do_work_on_buildable_class(
buildable: type[BuildableChild],
filter_fn: Callable[[type[BuildableChild]], bool] | None = None,
) -> list[type[BuildableChild]]:
pass
Поскольку тип[BuildableChild] используется многократно, я подумал, что можно создать для него псевдоним, чтобы уменьшить количество скобок, которые вам нужно прочитать:

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

from collections.abc import Callable
from typing import TypeAlias, TypeVar

class Buildable: ...

BuildableChild = TypeVar("BuildableChild", bound=Buildable)
BuildableChildType: TypeAlias = type[BuildableChild]

def do_work_on_buildable_class(
buildable: BuildableChildType,
filter_fn: Callable[[BuildableChildType], bool] | None = None,
) -> list[BuildableChildType]:
pass
Мне это кажется правильным, но mypy вызывает ошибку «Отсутствующие параметры типа» для универсального типа «BuildableChildType» для этих строк:

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

    buildable: BuildableChildType,
filter_fn: Callable[[BuildableChildType], bool] | None = None,
) -> list[BuildableChildType]:
Итак, предполагается, что type[BuildableChild] является универсальным, и я думаю, что это технически правильно, но как еще я мог бы написать псевдоним типа для типа TypeVar?< /p>
Я не думаю, что использование BuildableChildType[Any] — решение, потому что это разрушает всю идею использования псевдонима.
Я сделал также попробуйте переписать

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

BuildableChildType: TypeAlias = type[BuildableChild]
для

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

type BuildableChildType = type[BuildableChild]
но тогда mypy поднимает Все параметры типа должны быть объявлены («BuildableChild» не объявлены) ошибка для этой строки


Подробнее здесь: https://stackoverflow.com/questions/792 ... r-and-mypy
Ответить

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

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

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

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

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