【问题标题】:mypy calls error: Class cannot subclass 'ObjectType' (has type 'Any') on graphenemypy 调用错误:类不能在石墨烯上子类化“ObjectType”(具有“Any”类型)
【发布时间】:2018-09-07 18:22:00
【问题描述】:

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

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")

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

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

我找到了解决方法put a # type: ignore to silence the error,但我需要解决这个问题,而不是静音。更改 mypy 选项不是一种选择。

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

【问题讨论】:

    标签: python-3.x mypy graphene-python


    【解决方案1】:

    解决这个问题的最简洁和最有原则的解决方案是为石墨烯库创建包含类型提示的存根。然后,您可以将 mypy 指向本地的这些存根,或者考虑将它们贡献回库本身(例如,将石墨烯转换为 PEP 561 compatible package)或将存根贡献给 typeshed

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

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

    (也就是说,我认为添加# type: ignore cmets 不一定是世界上最糟糕的事情。使用--ignore-missing-imports 标志实际上等同于在您的每个失败的导入中添加# type: ignore代码库。在这种情况下,忽略更多错误并不会真正造成伤害。)

    【讨论】:

      猜你喜欢
      • 2017-11-13
      • 2018-10-22
      • 2020-06-21
      • 1970-01-01
      • 2018-03-06
      • 2020-01-08
      • 2021-08-24
      • 2020-11-18
      • 1970-01-01
      相关资源
      最近更新 更多