如何使用 mypy 的内部类型检查功能?
How can I use mypy's internal type checking functionality?
我正在开发一个系统,让您可以使用 GUI 编写一些基本的 python 以用作应用程序中的脚本。
它所做的其中一件事是让您将属性设置为某个值,我想看看它是否可以由在 GUI 中实现的类型处理程序之一处理。本机 python 类型模块无法检查 str
是否是 Optional[str]
的有效类型,或者 int
是否对 Union[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)
mypy 并非旨在用作导入库。唯一受支持的用途是通过其命令行界面(运行 直接或作为守护进程)。没有对您尝试执行的操作的支持。
mypy 的“类型”或“子类型”概念仅在静态分析期间有意义,在运行时没有意义。 mypy 的类型概念在源代码和解析信息方面起作用,并且完全独立于用于表示类型的任何运行时对象。给定一个表示类型的运行时对象,通常甚至不可能确定 mypy 会看到什么类型。例如,NewType
对象没有足够的信息来重建其原始源位置,并且类型变量在不同上下文中以无法在运行时重建的方式表示不同的事物。
即使您设法挖掘出足够多的实现细节来使它接近工作,它也可能在下一次更新时全部中断,因为对于这种不受支持的 mypy 内部结构的使用没有向后兼容性保证。
正如 提到的,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'
我正在开发一个系统,让您可以使用 GUI 编写一些基本的 python 以用作应用程序中的脚本。
它所做的其中一件事是让您将属性设置为某个值,我想看看它是否可以由在 GUI 中实现的类型处理程序之一处理。本机 python 类型模块无法检查 str
是否是 Optional[str]
的有效类型,或者 int
是否对 Union[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)
mypy 并非旨在用作导入库。唯一受支持的用途是通过其命令行界面(运行 直接或作为守护进程)。没有对您尝试执行的操作的支持。
mypy 的“类型”或“子类型”概念仅在静态分析期间有意义,在运行时没有意义。 mypy 的类型概念在源代码和解析信息方面起作用,并且完全独立于用于表示类型的任何运行时对象。给定一个表示类型的运行时对象,通常甚至不可能确定 mypy 会看到什么类型。例如,NewType
对象没有足够的信息来重建其原始源位置,并且类型变量在不同上下文中以无法在运行时重建的方式表示不同的事物。
即使您设法挖掘出足够多的实现细节来使它接近工作,它也可能在下一次更新时全部中断,因为对于这种不受支持的 mypy 内部结构的使用没有向后兼容性保证。
正如
但是 pytypes 旨在提供此功能并提供一个名为 is_subtype
的函数,一些示例使用:
from pytypes import is_subtype
print(is_subtype(float, int))
# prints 'False'
print(is_subtype(float, Optional[float]))
# prints 'True'