pycontracts是一个python包,它允许声明函数参数和返回值的约束。可以使用Python注释在装饰器中或在DoScord:Type:和:rType:标签中指定合同。pycontracts支持基本类型系统、变量绑定、算术约束,并且有几个专门的契约(特别是对于numpy数组),以及一个扩展api。
PyContracts的Python项目详细描述
pycontracts是一个python包,它允许声明函数参数和 返回值。它支持基本类型系统、变量绑定、算术约束和 有几个专门的合同(特别是针对numpy阵列)。
作为快速介绍,请参见this presentation about PyContracts。
why:pycontracts的目的是not将python转换为静态类型语言 (尽管你可以随心所欲地严格要求),但是,更确切地说,要避免浪费时间和 各种先决条件的模糊检查。事实上,我发现 有助于施加值和大小约束。例如,“我至少需要一个 3正数“可以表示为list[>=3](number, >0))。如果你发现了 pycontracts对您来说太过分了,您可能需要尝试一种更简单的替代方法,例如 typecheck。如果您发现pycontracts对您来说不够 使用Haskell而不是python。
指定合同:合同可以通过三种方式指定:
使用``@contract``装饰符:
@contract(a='int,>0', b='list[N],N>0', returns='list[N]') def my_function(a, b): ...
使用注释(对于python 3):
@contract def my_function(a : 'int,>0', b : 'list[N],N>0') -> 'list[N]': # Requires b to be a nonempty list, and the return # value to have the same length. ...
使用docstrings,带有:type:和:rtype:标记:
@contract def my_function(a, b): """ Function description. :type a: int,>0 :type b: list[N],N>0 :rtype: list[N] """ ...
deployment:在生产环境中,可以使用函数contracts.disable_all()禁用所有检查,因此性能命中为0。
扩展:您可以使用新的合同类型扩展pycontracts:
new_contract('valid_name', lambda s: isinstance(s, str) and len(s)>0) @contract(names='dict(int: (valid_name, int))') def process_accounting(records): ...
任何python类型都是一个契约:
@contract(a=int, # simple contract b='int,>0' # more complicated ) def f(a, b): ...
强制接口:ContractsMeta是一个元类, 类似于abcmeta,它将契约传播到子类:
from contracts import contract, ContractsMeta, with_metaclass class Base(with_metaclass(ContractsMeta, object)): @abstractmethod @contract(probability='float,>=0,<=1') def sample(self, probability): pass class Derived(Base): # The contract above is automatically enforced, # without this class having to know about PyContracts at all! def sample(self, probability): ....
numpy:对numpy有特殊支持:
@contract(image='array[HxWx3](uint8),H>10,W>10') def recolor(image): ...
status:语法稳定,不会更改。pycontracts在python 2.x上经过了很好的测试。
status on python 3.x:我们达到了功能奇偶性!现在一切都在python 3上运行。
贡献者:
- Chris Beaumont(哈佛史密森天体物理中心):$varsyntax;kwargs/args用于扩展。
- Brett Graham(哈佛大学罗兰研究所):attr(name:type)检查属性类型的语法。
- William Furr:错误报告和性能改进
- Karol Kuczmarski(谷歌苏黎世):实现“字符串”和“Unicode”合同
- Maarten Derickx(leiden u.):文档修复
- Calen Pennington(edx):禁用check()函数中的检查。
- Adam Palay(edx):环境变量启用/禁用重写的实现。
- Ryan Heimbuch:错误报告
- bernhard biskup:错误报告
- asharp:错误修复
- Dennis Kempin(google mothership):sphinx样式的约束规范
- Andy Hayden:python 3支持,更有效的numpy检查
- Jonathan Sharpe:类文件对象的协定,而不是运算符
(如果我忘记了任何人,请告诉我。)