Duš*_*ďar 5 python django stub mypy
对于返回如下查询集的函数使用什么类型的提示?
def _get_cars_for_validation(filter_: dict) -> QuerySet:
return (
Car.objects.filter(**filter_)
.values("id", "brand", "engine")
.order_by("id")
)
Run Code Online (Sandbox Code Playgroud)
mypy 返回错误
不兼容的返回值类型(得到“ValuesQuerySet[Car, TypedDict({'id': int,'brand': str,'engine': str})]”,预期为“QuerySet[Any]”)
我会使用,ValuesQuerySet但它已在 Django 1.9 中删除。ValuesQuerySet报告mypy来自3rd 方库django-stubs(我无法导入它;这实际上可能吗?)。
我遇到了完全相同的问题,我在GitHub 问题中找到了解决方案:
import typing
if typing.TYPE_CHECKING:
from django.db.models.query import ValuesQuerySet
def _get_cars_for_validation(filter_: dict) -> 'ValuesQuerySet[Car, int]':
return (
Car.objects.filter(**filter_)
.values("id", "brand", "engine")
.order_by("id")
)
Run Code Online (Sandbox Code Playgroud)
这if typing.TYPE_CHECKING会阻止ImportError您运行程序时出现这种情况,因为ValuesQuerySet仅在 mypy 检查期间才会导入不存在的内容。另请注意,注释必须是字符串:'ValuesQuerySet[Car, int]'。
第二个论点对'ValuesQuerySet[Car, int]'我来说是个谜;该问题的OP使用int“并且它有效”,就我而言,我尝试了其他几种类型,并且它们都有效;我想你也可以使用Any。
您可以使用reveal_type()自己检查变量的类型。