Estou trabalhando em um projeto Django. Como este é um projeto novo, desejo que ele seja totalmente anotado com anotações do tipo python 3.6+. Estou tentando anotar modelos, mas luto para encontrar um bom método para isso.
Vamos dar o IntegerField
exemplo. Vejo duas opções para anotá-lo:
# number 1
int_field: int = models.IntegerField()
# number 2
int_field: models.IntegerField = models.IntegerField()
O número 1 falha no mypy:
Incompatible types in assignment (expression has type "IntegerField[<nothing>, <nothing>]", variable has type "int")
O número 2 é bom para mypy, mas os IDE como PyCharm não conseguem resolvê-lo e geralmente reclamam dos tipos errados usados.
Existem práticas recomendadas para anotar corretamente os modelos, o que satisfará mypy e IDE?
python
django
type-annotation
Djent
fonte
fonte
Respostas:
Os modelos do Django (e outros componentes) são difíceis de anotar porque há muita mágica por trás deles, uma boa notícia é que um grupo de desenvolvedores legais já fez o trabalho duro por nós.
O django-stubs fornece um conjunto de stubs e plugins mypy que fornecem tipos estáticos e inferência de tipos para o Django.
Por exemplo, com o seguinte modelo:
mypy reclamaria dizendo:
Para corrigi-lo, basta instalar o pacote
e crie um
setup.cfg
arquivo com o seguinte:(Não esqueça de atualizar de
django_settings_module
acordo com o seu módulo de configurações)Feito isso, o mypy poderá inferir e verificar anotações para modelos do Django (e outros componentes).
Aqui está um exemplo do uso em uma exibição pequena:
Mais uma vez, mypy está satisfeito com as anotações fornecidas:
Na mesma nota, também está disponível um pacote para o Django Rest Framework: djangorestframework-stubs .
fonte