Как правильно использовать T=TypeVar('T',bound=...) с Type[T]? ⇐ Python
Как правильно использовать T=TypeVar('T',bound=...) с Type[T]?
У меня есть следующий код 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 ведет себя по-разному в этих двух примерах? Могу ли я как-то исправить оба случая?
У меня есть следующий код 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 ведет себя по-разному в этих двух примерах? Могу ли я как-то исправить оба случая?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Разница между Typevar ('t', a, b) и typevar ('t', bound = Union [a, b])
Anonymous » » в форуме Python - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-