如何使用输入Python模块执行类型检查?

时间:2016-06-22 16:37:54

标签: python typing

我正在阅读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。

2 个答案:

答案 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就可以解析你的整个源代码而不仅仅是当前行。

或者,您可能需要查看enforcetypeguard

答案 1 :(得分:0)

Pyadaaah库提供了自动运行时(动态)类型和范围检查以及类属性的信号。

例如从以下内容开始查看属于的youtube视频(系列):https://www.youtube.com/watch?v=Y3Hmg_HQtsY

顺便说一下,这也是(基础)属性/获取器/设置器机制的很好介绍。

Pyadaaah并未使用类型库。