Как правильно использовать T=TypeVar('T',bound=...) с Type[T]?Python

Программы на Python
Anonymous
Как правильно использовать T=TypeVar('T',bound=...) с Type[T]?

Сообщение Anonymous »


У меня есть следующий код Django с аннотацией типа:

при вводе import Необязательно, Тип, TypeVar из моделей импорта django.db T = TypeVar('T',bound=models.Model) def get_obj_or_none (модель: Type[T], obj_id: int) -> Необязательно[T]: пытаться: вернуть model.objects.get(pk=obj_id) кроме модели.DoesNotExist: возврат Нет Функция ожидает класс, производный от django.db.models.Model в качестве первого параметра и идентификатор int в качестве второго параметра:

# obj теперь является человеком с идентификатором 123 или None, если его не существовало. obj = get_obj_or_none (Человек, 123) Но когда я запускаю mypy для кода, я получаю ошибку:

ошибка: «Type[T]» не имеет атрибута «objects» ошибка: «Тип[T]» не имеет атрибута «DoesNotExist» Но если изменить мой код на этот и снова запустить mypy, я не получу ошибок:

при вводе import Необязательно, введите из моделей импорта django.db def get_obj_or_none(модель: Тип[models.Model], obj_id: int) -> Необязательно[models.Model]: пытаться: вернуть model.objects.get(pk=obj_id) кроме модели.DoesNotExist: возврат Нет Почему первый пример не работает? Я бы предпочел использовать его, поскольку второй пример никак не привязывает возвращаемое значение к параметру model, поэтому функция может возвращать экземпляр, который совершенно не связан с заданным классом. в качестве первого параметра.

Я использую Python 3.8.1 с mypy 0.761.

Изменить:

Вот автономный пример, который можно протестировать как есть:

при вводе import Dict, Необязательно, Тип, TypeVar Модель класса: объекты: Dict[int, 'Модель'] = {} T = TypeVar('T', граница=Модель) def get_obj_or_none (модель: Type[T], obj_id: int) -> Необязательно[T]: пытаться: вернуть модель.объекты[obj_id] кроме KeyError: возврат Нет Запуск mypy дает (к моему удивлению) совершенно другую ошибку:

type_example.py:17: ошибка: несовместимый тип возвращаемого значения (получено «Модель», ожидается «Необязательно [T]») Найдена 1 ошибка в 1 файле (проверен 1 исходный файл) Почему mypy ведет себя по-разному в этих двух примерах? Могу ли я как-то исправить оба случая?

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