考虑此模型的定义和用法:
from django.db import models
class User(models.Model):
name: str = models.CharField(max_length=100)
def do_stuff(user: User) -> None:
# accessing existing field
print(user.name.strip())
# accessing existing field with a wrong operation: will fail at runtime
print(user.name + 1)
# acessing nonexistent field: will fail at runtime
print(user.name_abc.strip())
与此同时运行mypy
时,我们将收到user.name + 1
的错误:
error: Unsupported operand types for + ("str" and "int")
这很好。但是代码中还有另一个错误-user.name_abc
不存在,并且会在运行时导致AttributeError。
但是,mypy不会看到此信息,因为它允许代码访问任何django属性,并将它们也视为Any
:
u = User(name='abc')
reveal_type(user.abcdef)
....
> error: Revealed type is 'Any
所以,如何使mypy看到此类错误?
标志--check-untyped-defs
(或--strict
)报告缺少的属性。用mypy version 0.740
检查。我认为您正在使用django-stubs
插件。