Python 如何使用mypy';s的内部类型检查功能?

Python 如何使用mypy';s的内部类型检查功能?,python,python-3.x,types,mypy,Python,Python 3.x,Types,Mypy,我正在开发一个系统,该系统允许您使用GUI编写一些基本的python,作为应用程序中的脚本 它所做的一件事是让您将属性设置为某个值,我想看看它是否可以由GUI中实现的一个类型处理程序来处理。本机python键入模块无法检查str是否为Optional[str]的有效类型,或者int是否为Union[float,int,complex]等的有效类型 然而,mypy静态地执行这种类型检查,并且有一个名为的函数,我认为在这种情况下该函数非常有效;然而,当我用python类型调用它时,我得到了异常Typ

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

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

然而,mypy静态地执行这种类型检查,并且有一个名为的函数,我认为在这种情况下该函数非常有效;然而,当我用python类型调用它时,我得到了异常
TypeError:mypy.types.Type对象;获取类型
,请参见下面的代码

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

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

mypy不是设计用来作为导入库的。唯一受支持的使用是通过其命令行界面(直接运行或作为守护进程运行)。没有人支持你试图做的事情

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


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

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

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

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

正如前面提到的,mypy不是为此而设计的。在与非常熟悉其内部结构的人交谈之后,最好的答案是将代码的一些位赋值给AST,然后将它们加载到mypy的内部

但是,设计用于提供此功能,并提供一个名为
is\u subtype的函数
一些示例使用:

from pytypes import is_subtype

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

print(is_subtype(float, Optional[float]))
# prints 'True'
如前所述,mypy不是为此而设计的。在与非常熟悉其内部结构的人交谈之后,最好的答案是将代码的一些位赋值给AST,然后将它们加载到mypy的内部

但是,设计用于提供此功能,并提供一个名为
is\u subtype的函数
一些示例使用:

from pytypes import is_subtype

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

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

我注意到mypy希望它的所有类型都有源位置,但这似乎只用于在解析后跟踪增量文件的更改。您能否详细说明在运行时使用inspect.signature检索到的打字信息与mypy使用的不同之处?它输出了一些不错的错误,比如get“Tuple[Union[str,int]、Union[str,int]]、expected“Tuple[int,int]”,这些错误看起来就像我在运行时可以获得的类型信息。我注意到mypy希望它的所有类型都有源位置,但这似乎只用于在解析后跟踪增量文件的更改。您能否详细说明在运行时使用inspect.signature检索到的打字信息与mypy使用的不同之处?它输出了一些不错的错误,比如得到“Tuple[Union[str,int]、Union[str,int]]、预期的“Tuple[int,int]”,这些错误看起来就像我在运行时可以得到的类型信息。