Как правильно использовать 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 ведет себя по-разному в этих двух примерах? Могу ли я как-то исправить оба случая?
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Разница между Typevar ('t', a, b) и typevar ('t', bound = Union [a, b])
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Как проверить, имеет ли переменная тип TypeVar(bound=X)
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как проверить, имеет ли переменная тип TypeVar(bound=X)
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как проверить, имеет ли переменная тип TypeVar(bound=X)
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Как проверить, имеет ли переменная тип TypeVar(bound=X)
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

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