使用 Sphinx docstrings 进行 @typesafe 类型检查
项目描述
sphinx_typesafe 是一个装饰器,它可以在 Python 方法和方法调用上启用动态类型检查。它与 Sphinx 样式 docstrings 一起工作,这使得它特别方便于保持代码文档与实际执行的代码保持更新。
特点概述
装饰器可以附加到任何函数或方法。
如果参数的类型与规范不匹配,则引发 TypeError。
如果返回值的类型与规范不匹配,则引发 TypeError。
执行动态类型检查。
Python2
由于 Python2 中没有函数注解,Python2 的类型检查是参数的文档约定,基于 Sphinx 的信息字段列表。因此,即使您不使用类型检查,您也可以使用它来生成文档。
Python2中使用sphinx风格文档字符串的语法
这是首选的方式,因为这样你也会在文档化你的代码。
from sphinx_typesafe.typesafe import typesafe @typesafe def foo(param_a, param_b, param_c): """ :type param_a: types.StringType :type param_b: types.IntType :type param_c: types.NotImplementedType :rtype: types.BooleanType """ # Do Something return True
Python2中使用装饰器参数的语法
这是一个备选方案,在Sphinx风格文档不被允许或不需要的情况下很有用。
from sphinx_typesafe.typesafe import typesafe @typesafe( { 'param_a' : 'str', 'param_b' : 'types.IntType', 'param_c' : 'own_module.OwnType', 'return' : 'bool' } ) def foo(param_a, param_b, param_c): """ Some Docstring Info """ # Do Something return True
你可以使用任何Python类型
所以如果你在模块mod1中定义了一个Point类,如下所示
# File: mod1.py class Point(object): def __init__(self, x = None, y = None): """ Initialize the Point. Can be used to give x,y directly.""" self.x = x self.y = y
那么你可以在你的代码中这样使用这个类型
from mod1 import Point from sphinx_typesafe.typesafe import typesafe @typesafe def foo(afunc): """ :type afunc: mod1.Point :rtype: types.BooleanType """ return True
Python3
基本技术是PEP-3107中提出的函数注解,这在Python3 What’s New中有文档记录(见新语法部分)。
Python3的语法
from sphinx_typesafe.typesafe import typesafe @typesafe def foo(param_a: str, param_b: int) -> bool: # Do Something return True
当调用foo时,@typesafe装饰器将动态检查所有参数以确保类型有效。
引用PEP 3107中的话:“所有注解的参数类型可以是任何Python表达式。”,但为了类型检查,只有类型才有意义。
这个想法和实现的部分灵感来自于这本书:Pro Python (Expert’s Voice in Open Source)
从源代码构建
从一个干净且最小化的虚拟环境开始,例如
$ pip list pip (1.4) setuptools (2.1) wsgiref (0.1.2)
下载源代码并运行测试用例
$ git clone https://github.com/frgomes/sphinx_typesafe $ cd sphinx_typesafe $ python setup.py devtest && py.test
常见问题解答
为什么它被命名为 IcanHasTypeCheck?
IcanHasTypeCheck (ICHTC),指的是著名的lolcats。
为什么现在叫做 sphinx_typesafe?
因为 typesafe 直接说明了它是什么。不幸的是,typesafe 已经在 PyPI 上被占用,所以 sphinx_typesafe 似乎是一个很好的替代名称,也与采用的文档标准相关。
支持
请在此页面的顶部找到链接。
变更
0.3 (2014年2月13日)
多个错误修复和增强
更好地解决类型名称
修复了对方法的支持
修复了文档
测试套件现在有60个测试案例
支持 types.NoneType
更严格的文档与参数的匹配
支持忽略类型检查:types.NotImplementeType
暴露函数 get_class_type
0.2 (2013年12月3日)
Richard Gomes <rgomes.info@gmail.com> 对代码进行了全面审查和重写
@typesafe 现在是一个类
代码重组和一些优化
为迁移到 Python3 准备代码
新功能
增加了对装饰函数返回类型的验证
错误修复
类型解析器现在可以找到涉及多个嵌套模块的类型
类型解析器假设简单名称(如‘bool’)的模块为‘__builtin__’
重命名为 sphinx_typesafe
文档以 reStructuredText 重新编写
添加了 readthedocs.org 所需的 docs 目录
第一个版本部署到 PyPI
0.1
ICanHasTypeCheck (ICHTC) 的原始版本由 Klaas <khz@tzi.org> 编写
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。