python - 如何使用 mypy 的内部类型检查功能?
问题描述
我正在开发一个系统,该系统允许您使用 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 内部使用没有向后兼容性保证。
推荐阅读
- javascript - 如何在 javascript 中使用另一个文件中的变量和函数?
- docker - Docker:如何通过存储一些登录凭据来创建映像
- r - 为满足 R 中的一个条件的条目创建具有特定值的新列
- php - 在使用 php 接收到 MySQL 结果之后,如何将它们按类型分组,但在编码为 json 之前?
- performance - 用左连接删除
- spring-boot - 无法在 Gradle 5.x 中使用 bootRun addresources=true
- python - 从 for 循环返回的具有相同索引的 Concat 数据帧
- html - 如果页面超出正常高度,页脚浮动
- .net-core - 读/写文件后调用垃圾收集器
- r - 如何快速将引号和逗号添加到 R 中 c() 的项目列表中?