首页 > 解决方案 > 如何使用 mypy 的内部类型检查功能?

问题描述

我正在开发一个系统,该系统允许您使用 GUI 编写一些基本的 python 以用作应用程序中的脚本。

它所做的其中一件事是让您将属性设置为某个值,我想看看它是否可以由在 GUI 中实现的类型处理程序之一处理。本机python类型模块没有办法检查是否str是有效类型Optional[str]或是否intUnion[float, int, complex]等有效......

但是,mypy 会静态地进行这种类型检查,并且有一个名为is_subtype的函数,我认为在这种情况下它会很好用;但是,当我使用 python 类型调用它时,我得到了异常TypeError: mypy.types.Type object expected; got type,请参见下面的代码。

mypy 内部非常复杂,我找不到从 python 类型到 mypy 内部期望的清晰路径,是否有一种简单的方法可以将本机 python 类型转换为 mypy 类型,或者我应该在 mypy 中使用的另一个函数在运行时检查类型兼容性?

from mypy.subtypes import is_subtype
is_subtype(float, int)

标签: pythonpython-3.xtypesmypy

解决方案


mypy 不是为用作导入库而设计的。唯一受支持的使用是通过其命令行界面(直接运行或作为守护程序运行)。没有支持您正在尝试做的事情。

mypy 的“类型”或“子类型”概念仅在静态分析期间才有意义,而不是在运行时。mypy 的类型概念在源代码和解析信息方面起作用,并且与用于表示类型的任何运行时对象完全分开。给定一个表示类型的运行时对象,甚至通常不可能确定 mypy 会看到什么类型。例如,NewType对象没有足够的信息来重建它们的原始源位置,类型变量在不同的上下文中意味着不同的东西,在运行时无法重建。

即使您设法挖掘了足够的实现细节以使其接近工作,它也可能会在下一次更新时中断,因为对于这种不受支持的 mypy 内部使用没有向后兼容性保证。


推荐阅读