Django的Mypy存根
django-stubs的Python项目详细描述
Django框架的PEP484存根
这个包包含类型stubs和mypy插件,为django框架提供更精确的静态类型和类型推断。django使用了一些python“魔术”,这使得一些代码模式的精确类型成为问题。这就是为什么我们需要在stub中附带mypy插件。最后一个目标是能够获得最常见模式的精确类型。
支持Python3.6/3.7和Django 2.1/2.2。
可以在django的早期版本上运行,但预计会出现一些缺少导入警告的情况。
安装
pip install django-stubs
警告:1.0.0之前版本的所有配置都将被删除,请使用下面的配置。
警告:1.0.0中断dmypy
,如果需要,请继续使用0.12.x系列。
要让mypy知道这个插件,您需要添加
[mypy]
plugins =
mypy_django_plugin.main
在你的mypy.ini
文件中。
插件要求在mypy.ini
文件中指定django设置模块(放入DJANGO_SETTINGS_MODULE
变量中的内容)。
[mypy]
strict_optional = True
; this one is new
[mypy.plugins.django-stubs]
django_settings_module = mysettings
其中mysettings
是DJANGO_SETTINGS_MODULE
的值(带或不带引号)
你对mypy/django插件找不到你的设置模块有问题吗?尝试将项目的根路径添加到pythonpath环境变量中。如果使用pipenv,可以将以下内容添加到项目根目录中的.env
文件中,pipenv将在执行任何命令之前自动运行该文件。
PYTHONPATH=${PYTHONPATH}:${PWD}
新的实现使用django运行时来提取模型信息,因此如果安装的应用程序models.py
不正确,它将崩溃。出于同样的原因,您不能在将为django.setup()
执行的任何python文件的全局范围内使用reveal_type
。
换句话说,如果您的manage.py runserver
崩溃,mypy也将崩溃。
注释
实现monkey补丁django将__class_getitem__
添加到Manager
类。如果您使用python3.7并在您的代码中也这样做,那么您可以做如下事情
class MyUserManager(models.Manager['MyUser']):
pass
class MyUser(models.Model):
objects = UserManager()
工作,这会使错误消息更好一点。
否则,将在mypy中创建名为MyUser__MyUserManager
的自定义类型,它将重写基管理器为models.Manager[User]
,以使get_queryset()
等方法返回正确类型的QuerySet
。
获取帮助
我们这里有吉特https://gitter.im/mypy-django/Lobby。
如果你认为你有更一般的打字问题,请参考https://github.com/python/mypy和他们的gitter。