Estoy trabajando en un proyecto de Django. Dado que este es un proyecto nuevo, quiero que esté completamente anotado con anotaciones de tipo python 3.6+. Estoy tratando de anotar modelos, pero me cuesta encontrar un buen método para eso.
Tomemos el IntegerField
como ejemplo. Veo dos opciones para anotarlo:
# number 1
int_field: int = models.IntegerField()
# number 2
int_field: models.IntegerField = models.IntegerField()
El número 1 falla en mypy:
Incompatible types in assignment (expression has type "IntegerField[<nothing>, <nothing>]", variable has type "int")
El número 2 está bien para mypy, pero los IDE como PyCharm no pueden resolverlo y a menudo se quejan de los tipos incorrectos utilizados.
¿Existen mejores prácticas para anotar correctamente los modelos, que satisfagan mypy e IDE?
python
django
type-annotation
Djent
fuente
fuente
Respuestas:
Los modelos de Django (y otros componentes) son difíciles de anotar porque hay mucha magia detrás de ellos, una buena noticia es que un grupo de desarrolladores geniales ya han hecho el trabajo duro por nosotros.
django-stubs proporciona un conjunto de stubs y complementos mypy que proporcionan tipos estáticos e inferencia de tipos para Django.
Por ejemplo, tener el siguiente modelo:
mypy se quejaría diciendo:
Para solucionarlo, es suficiente instalar el paquete
y crea un
setup.cfg
archivo con lo siguiente:(No olvide actualizar
django_settings_module
según su módulo de configuración)Una vez hecho esto, mypy podrá inferir y verificar anotaciones para los modelos de Django (y otros componentes).
Aquí hay un ejemplo del uso en una vista pequeña:
Una vez más, mypy está contento con las anotaciones proporcionadas:
En la misma nota, también está disponible un paquete para Django Rest Framework: djangorestframework-stubs .
fuente