mypy和django模型:如何检测不存在的属性上的错误

时间:2018-11-19 07:51:20

标签: django mypy

考虑此模型的定义和用法:

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看到此类错误?

1 个答案:

答案 0 :(得分:0)

标志--check-untyped-defs(或--strict)报告缺少的属性。 用mypy version 0.740检查。 我假设您正在使用django-stubs插件。