跳转到主要内容

使用 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> 编写

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

sphinx_typesafe-0.3.zip (30.0 kB 查看哈希值)

上传时间 源代码

sphinx_typesafe-0.3.tar.gz (17.6 kB 查看哈希值)

上传时间 源代码

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面