首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有修复InheritanceManager打破静态类型检查?

是否有修复InheritanceManager打破静态类型检查?
EN

Stack Overflow用户
提问于 2022-07-29 10:45:54
回答 1查看 72关注 0票数 3

我已经将django-模型-utils添加到现有的(大型)项目中,而构建现在正在失败,因为构建的一部分包括使用mypy进行静态类型检查。

它抱怨我添加了objects = InheritanceManager()的模型没有反向ForeignKeys的属性,如果反向FK是在该模型上的方法中访问的。例如,以以下内容为例:

代码语言:javascript
复制
class Student(Model):
    school = ForeignKey(School, related_name='students')

class School(Model):
    objects = InheritanceManager()  # IRL School is a subclass of some other model
    def something(self):
        return self.students.filter(...)

然后运行mypy对它,将返回:

代码语言:javascript
复制
error: "School" has no attribute "students"

即使我移除related_name,并使用self.student_set (即默认的django关系),它仍然会产生相同类型的错误。只有删除InheritanceManager才能修复静态类型检查。当然,我使用它是有原因的,因为我需要在代码的其他地方使用select_subclasses

有没有人遇到过这种情况,或者有什么解决办法?

EN

回答 1

Stack Overflow用户

发布于 2022-07-29 11:17:14

django-stubs使用插件添加所有管理器。只有当添加的管理器是models.Manager的“子类”(不仅是真正的子类,而且还可以被models.Manager识别)时,才会触发这个插件。

django-model-utils是非类型化的,因此InheritanceManager实际上是用于mypyAny,而插件没有看到它。为了准确地解决这个问题,我在包安装后将py.typed标记添加到django-model-utils作为CI阶段。您还可以在py.typed中使用叉,也可以为django-model-utils创建存根包。这可能导致其他问题,并没有提供良好的类型检查(所有未注释的方法都有Any作为隐式参数和返回类型),但总比没有好。为了满足我的需要,记号笔已经足够了。

py.typed标记是位于package (venv/lib/.../django_model_utils/py.typed)中的一个空文件-它告诉mypy包不需要单独的存根,并且包含所有必需的类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73165489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档