【发布时间】:2016-06-22 16:37:53
【问题描述】:
我正在阅读 typing 模块代码并查看 mypy 以了解它是如何进行类型检查的。对我来说不幸的是,mypy 构建了一个非常智能的树,其中包含我仍然不理解的类型表达式,而且这一切都基于静态分析。
我想在 Python 中实现一个动态(无静态分析)的类型检查系统。假设执行类型检查的函数称为check_type,我想完成以下操作:
>>> import typing
>>>
>>> check_type(1, int)
True
>>> check_type(1, float)
False
>>> check_type([1], typing.List[int])
True
>>> check_type([1], typing.List[float])
False
>>> check_type([1], typing.List[typing.Any])
True
>>> check_type((1,), typing.Tuple[int])
True
我想过从它的值重新创建对象类型,例如:
>>> get_type([1])
typing.List<~T>[int]
但这不适用于issubclass:
>>> issubclass(typing.List[int], typing.List[typing.Any])
False
我没有看到一种简单的方法来检查 Python 中的类型而不假设很多关于 the internals of the typing stdlib module 的事情(例如,访问 __args__ 或 __tuple_params__)。
如何正确实现适用于前面列出的案例的check_type 函数?我正在使用 Python 2.7。
【问题讨论】:
-
这不就是
isinstance吗? -
不,@user2357112。
isinstance不完全检查类型。例如:isinstance(['string'], typing.List[int]) is True当这不是我想要的。 -
@freakish:查看mypy,这是一个用于 Python 的静态类型分析工具,也是类型提示背后的主要驱动力之一。
-
不是一个真正的答案,但检查类型的pythonic方法是使用
try/except语句并将您要测试的值视为您期望的值,如果引发TypeError异常,请执行别的东西或只是通过 -
@freakish:PEP-484(已接受)。虽然它并不完全适用于 Python 2.7。