灵活的函数参数显式运行时类型检查(仅限python3)

typecheck-decorator的Python项目详细描述


函数的装饰符@tc.typecheck,与一起使用 python3函数参数和函数结果注释。 decorator将对函数的每个调用执行动态参数类型检查。

@tc.typecheck
def foo1(a:int, b=None, c:str="mydefault") -> bool :
    print(a, b, c)
    return b is not None and a != b

部分:int:str-> bool是注释。 这是python 3中引入的语法特性,其中:(用于参数) 和->(对于结果)是分隔符,其余的可以是 任意表达。 理解这一点很重要, 注释没有任何语义。 一定有明确的python代码 它看着他们,做一些事情,以便给他们一个意义。

@tc.typecheckdecorator赋予上述注释以下含义: foo1的参数a必须具有类型intb没有注释,可以有任何类型,它将不会被检查, c必须具有类型字符串, 函数的结果必须是 True(不是17"yes"[3,7,44]或诸如此类的)或 False(不是0None[]或诸如此类)。

如果任何参数的类型错误,将引发TypeCheckError异常 在运行时。 类类型、集合类型、固定长度集合和 类型谓词也可以被注释。

从python 3.5开始,pep 484指定注释应该是类型和 它们的正常使用将是类型检查。 许多高级类型(如Sequence[int])现在可以通过 typingmodule,它也可以在pypi上用于 Python3。

当前模块支持这些typing注释,但它早于 python 3.5,因此有其他形式的类型规范(通过类型 谓词)以及。 其中许多是等价的,但有些更强大。

下面是一个更复杂的示例:

import typecheck as tc

@tc.typecheck
def foo2(record:(int,int,bool), rgb:tc.re("^[rgb]$")) -> tc.any(int,float) :
    # don't expect the following to make much sense:
    a = record[0]; b = record[1]
    return a/b if (a/b == float(a)/b) else float(a)/b

foo2((4,10,True), "r")   # OK
foo2([4,10,True], "g")   # OK: list is acceptable in place of tuple
foo2((4,10,1), "rg")     # Wrong: 1 is not a bool, string is too long
foo2(None,     "R")      # Wrong: None is no tuple, string has illegal character

这些注释意味着record是由两个int和 实际的bool和rgb是一个单字符字符串,即 通过正则表达式测试“r”或“g”或“b”。 结果将是一个可以是int或float的数字。

其中的第一个和第三个可以用typing注释表示为 好吧,第二个不是。最接近的近似是这样的:

import typing as tg
import typecheck as tc

@tc.typecheck
def foo2(record:tg.Tuple[int,int,bool], rgb:str) -> tg.Union[int,float] :
    """rgb must be one of "r","g","b"."""
    a = record[0]; b = record[1]
    return a/b if (a/b == float(a)/b) else float(a)/b

foo2((4,10,True), "r")   # OK
foo2([4,10,True], "g")   # OK: list is acceptable in place of tuple
foo2((4,10,1), "rg")     # Wrong: 1 is not a bool (but meant-to-be-too-long string is not detected)
foo2(None,     "R")      # Wrong: None is no tuple (but meant-to-be-illegal character is not detected)

其他类型的注释:

  • tc.optional(int)tg.Optional[int]将允许int和none,
  • tc.enum(1, 2.0, "three")允许定义特殊枚举类型,
  • tc.map_of(str, tc.list_of(Person))tg.Mapping[str, tg.MutableSequence[Person]] 描述字典或其他映射 键是字符串,所有值都是相同的人员列表,
  • 等等。

对Cpython 3.3,3.4,3.5进行毒性测试。

文档可在 https://github.com/prechelt/typecheck-decorator

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么在ng构建之后使用404?   java Maven原型“quickstart”无法扩展其POM   java Arduino端口卡在满功率状态   java如何确保在参数化构造函数失败时不调用默认构造函数?   java检测Blackberry中的切换失败   java如何将安卓库(作为Angle)链接到Eclipse项目?   java压缩图片,但获取“未知压缩方法”   java无法对应该初始化的模拟实例进行测试   将现有eclipse项目导出到war文件时,java“模块名无效”   java如何防止AppletClassLoader在查找类/其他资源时击中服务器?   java正则表达式根据分隔组的分隔符的数量获取n个组   java在JLayeredPane后面与JPanel交互   Java中的xml Soap请求   webView中的java utf8代码页