pycontracts是一个python包,它允许声明函数参数和返回值的约束。可以使用Python注释在装饰器中或在DoScord:Type:和:rType:标签中指定合同。pycontracts支持基本类型系统、变量绑定、算术约束,并且有几个专门的契约(特别是对于numpy数组),以及一个扩展api。

PyContracts的Python项目详细描述


https://circleci.com/gh/AndreaCensi/contracts.svg?style=svg

pycontracts是一个python包,它允许声明函数参数和 返回值。它支持基本类型系统、变量绑定、算术约束和 有几个专门的合同(特别是针对numpy阵列)。

作为快速介绍,请参见this presentation about PyContracts

A presentation about PyContracts
下面是一个简短的总结。完整文档请参见:<;http://andreacensi.github.com/contracts/>;

why:pycontracts的目的是not将python转换为静态类型语言 (尽管你可以随心所欲地严格要求),但是,更确切地说,要避免浪费时间和 各种先决条件的模糊检查。事实上,我发现 有助于施加值和大小约束。例如,“我至少需要一个 3正数“可以表示为list[>=3](number, >0))。如果你发现了 pycontracts对您来说太过分了,您可能需要尝试一种更简单的替代方法,例如 typecheck。如果您发现pycontracts对您来说不够 使用Haskell而不是python。

指定合同:合同可以通过三种方式指定:

  1. 使用``@contract``装饰符

    @contract(a='int,>0', b='list[N],N>0', returns='list[N]')
    def my_function(a, b):
        ...
    
  2. 使用注释(对于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.
         ...
    
  3. 使用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上运行。

贡献者

(如果我忘记了任何人,请告诉我。)

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

推荐PyPI第三方库


热门话题
正则表达式Java使用关键字拆分字符串   Neo4j Java API模式索引范围查找?   java访问JButton[]   java如何混淆tomcat日志文件中的请求属性   apache运行CGI Java程序   java从一个Eclipse插件开始,我如何通过编程使Eclipse编辑某个文件?   从php中的SQL数据库到Java中的多个值作为单独的变量   java如何在多个osgi捆绑包之间共享资源   datetime Java time,无法从历元秒解析年份   java无法在安卓应用程序中使用morpho指纹扫描仪设备捕获指纹   java使用groovy/ratpack发送电子邮件   javascript在jsp页面中添加验证,但在控制台中仍然显示一些错误   java如何修复com。mysql。jdbc。DocsConnectionPropsHelper   java AlertDialog dispatchTouchEvent