我正在阅读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。
答案 0 :(得分:2)
对于问题中提供的简单示例,您可以轻松获得功能非常有限的功能:
public DateTime When
{
get
{
// The next 2 variables should really be static to the class.
var culture = CultureInfo.CreateSpecificCulture("en-US");
var format = "MMMM yyyy";
return DateTime.ParseExact(this.Title, format, culture);
}
}
@foreach (var item in (Model.OrderBy(x => x.When)))
{
<li><a href="@Url.Action("Index", "BudgetHistories",
new { Title = item.Title })">
<i class="fa fa-dollar"></i>
<span>@item.Title</span></a>
</li>
}
你甚至可以通过扩展这段代码来做一些更高级的东西(例如,参考你在程序中定义的类对应的类型),这样mypy就可以解析你的整个源代码而不仅仅是当前行。
答案 1 :(得分:0)
Pyadaaah库提供了自动运行时(动态)类型和范围检查以及类属性的信号。
例如从以下内容开始查看属于的youtube视频(系列):https://www.youtube.com/watch?v=Y3Hmg_HQtsY
顺便说一下,这也是(基础)属性/获取器/设置器机制的很好介绍。
Pyadaaah并未使用类型库。