mypy calls error: Class cannot subclass 'ObjectType' (has type 'Any') on graphene

mypy calls error: Class cannot subclass 'ObjectType' (has type 'Any') on graphene

我正在使用石墨烯构建 graphQL 模式,并使用 mypy 进行静态类型检查。 架构代码如下所示:

from typing import Dict, List, NamedTuple, Union    
import graphene


class PossibleAnswer(graphene.ObjectType):
    """Object representing single possible answer, a pair of key and text."""

    paId = graphene.String(
        description="Answer id, automatically generated sequence number.")
    text = graphene.String(description="Answer text, in requested language")

当我 运行 mypy 检查 --ignore-missing-imports --strict 选项时,我得到错误:

error: Class cannot subclass 'ObjectType' (has type 'Any')

我找到了解决方法 ,但我需要解决这个问题,而不是静音。更改 mypy 选项不是一个选项。

如何告诉 mypy 这是石墨烯类型,而不是我正在创建的对象的 Any 类型?

解决此问题的最干净、最有原则的解决方案是为石墨烯库创建包含类型提示的存根。然后,您可以将 mypy 指向本地的那些存根,或者考虑将它们贡献回库本身(例如,将石墨烯变成 PEP 561 compatible package) or contribute the stubs to typeshed.

请注意,这些存根不一定要完整。您可以通过在该库中定义一些仅包含核心 类 的最小存根并让大多数其他内容动态键入来消除大部分 mypy 错误。 (然后您可以随着时间的推移充实您的存根,而不必投入投资将它们全部编写一次。)

无论如何,这里要记住的核心规则是,如果某些包不使用类型提示,mypy 将不会尝试推断任何关于它的信息,并且会假设您从它导入的所有内容都是 Any 类型。如果您不愿意添加类型提示来帮助 mypy 理解该库,不幸的是,剩下的唯一策略就是使用解决方法,例如添加 # type: ignore.

(也就是说,我认为添加 # type: ignore 评论不一定是世界上最糟糕的事情。使用 --ignore-missing-imports 标志实际上等同于添加 # type: ignore 到你的代码库中每一个失败的导入。从这个角度来看,消除更多的错误并没有什么坏处。)