mypy调用错误:类不能在石墨烯上子类化'ObjectType'(类型为'Any')

问题描述 投票:0回答:1

我正在使用石墨烯和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个回答
0
投票

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

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

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

(也就是说,我不认为添加# type: ignore评论一定是世界上最糟糕的事情。使用--ignore-missing-imports标志实际上相当于在你的代码库中为每一个失败的导入添加一个# type: ignore。在这种情况下,静音一些更多错误不会真正受到伤害。)

© www.soinside.com 2019 - 2024. All rights reserved.