如何使用mypy的内部类型检查功能?

时间:2020-07-29 18:24:18

标签: python python-3.x types mypy

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

它的作用之一是让您将属性设置为某个值,我想看看它是否可以由GUI中实现的类型处理程序之一处理。原生python输入模块无法检查strOptional[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)

2 个答案:

答案 0 :(得分:2)

mypy并非旨在用作导入的库。唯一受支持的用途是通过其命令行界面(直接运行或作为守护程序运行)。您尝试执行的操作不支持。

mypy的“类型”或“子类型”概念仅在静态分析时才有意义,而在运行时才有意义。 mypy的类型概念在源代码和解析信息方面起作用,并且与用于表示类型的任何运行时对象完全分开。给定一个表示类型的运行时对象,通常甚至无法确定mypy将看到的类型。例如,NewType对象没有足够的信息来重构其原始源位置,并且类型变量在不同的上下文中表示不同的事物,而这种方式在运行时无法重构。

即使您设法挖掘出足够的实现细节来使之接近正常工作,也可能会在下一次更新中全部中断,因为对于此类不受支持的mypy内部使用,没有向后兼容性保证。

答案 1 :(得分:0)

正如user2357112所述,mypy不是为此目的而设计的。与非常熟悉内部结构的人交谈后,最好的答案是将某些代码逃逸到AST,然后将其加载到mypy的肠子中。

然而,pytypes 旨在提供这种功能,并提供了一个名为is_subtype的功能,例如一些示例用法:

from pytypes import is_subtype

print(is_subtype(float, int))
# prints 'False'

print(is_subtype(float, Optional[float]))
# prints 'True'