mypy调用错误:类无法在石墨烯上子类化“ ObjectType”(类型为“ Any”)

时间:2018-09-07 18:22:01

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

我正在使用myene使用石墨烯和静态类型检查来构建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 check时出现错误:

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

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

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

1 个答案:

答案 0 :(得分:0)

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

请注意,这些存根不一定是完整的。您可以通过定义一些最小存根(仅包含该库中的核心类)并保留大多数其他内容进行动态键入的方式来使mypy的大多数错误保持沉默。 (然后,您可以随着时间的推移充实您的存根,而不必投入全部编写一次即可。)

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

(也就是说,我认为在这里添加# type: ignore注释不一定是世界上最糟糕的事情。使用--ignore-missing-imports标志实际上等效于向其中添加# type: ignore在代码库中,每一次导入失败都不会。因此,忽略更多错误并不会真正造成伤害。)