我正在使用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
类型?
答案 0 :(得分:0)
此问题最干净,最原则的解决方案是创建包含石墨烯库类型提示的存根。然后,您可以将mypy指向本地的那些存根,也可以考虑将它们存回库本身(例如,将石墨烯变成PEP 561 compatible package),也可以将存根存入typeshed。
请注意,这些存根不一定是完整的。您可以通过定义一些最小存根(仅包含该库中的核心类)并保留大多数其他内容进行动态键入的方式来使mypy的大多数错误保持沉默。 (然后,您可以随着时间的推移充实您的存根,而不必投入全部编写一次即可。)
无论如何,这里要记住的核心规则是,如果某些软件包不使用类型提示,则mypy将不会尝试推断任何有关它的内容,并会假设您从其中导入的所有内容均为Any
类型。如果您不愿意添加类型提示来帮助mypy理解库,那么不幸的是,剩下的唯一策略是使用变通方法,例如在# type: ignore
上添加标签。
(也就是说,我认为在这里添加# type: ignore
注释不一定是世界上最糟糕的事情。使用--ignore-missing-imports
标志实际上等效于向其中添加# type: ignore
在代码库中,每一次导入失败都不会。因此,忽略更多错误并不会真正造成伤害。)