python的函数契约

python-contracts的Python项目详细描述


python函数的契约

契约可用于验证函数的输入或输出。组件之间的数据流很难跟踪或维护,有时会迫使我们在任何地方编写打印语句,试图捕获格式错误的数据。这个契约库通过截取传入或传出函数的数据并检查它们是否满足指定的需求来解决这个问题。

入门

通过pip安装合同。

$ pip3 install python-contracts

一旦安装了契约,就可以导入输入和输出契约装饰器以及其他方便的限定符函数。

# Imports ic (input contract) and oc (output contract) fromcontractsimportic,oc# Examples of some qualifiersfromcontractsimportnatural,integer

有关可用限定符的列表,请参阅限定符。

合同

input contract是一个函数装饰器,它接受kwargs作为参数名到它们的限定符的映射。

输出协定是另一个decorator,它接受一个限定符并检查调用修饰函数的结果。

使用输入协定

fromcontractsimportic,natural@ic(val=natural)deffunc(val):returnval

func接受“val”作为参数。ic的参数应该与函数的参数名相对应。在这种情况下,合同规定“val”的参数应该是自然数。

ic可以接受与修饰函数的参数数目一样多的参数。所有键都应映射到正确的参数名。如果违反了约定,您将收到一条inputContractException错误消息,其中列出了失败的参数及其给定值。

contracts.exceptions.InputContractException:
Arguments that failed the contracts
val: -1

使用输出协定

fromcontractsimportoc,natural@oc(natural)deffunc(val):returnval

oc验证调用函数的结果。在这种情况下,它检查结果是否为自然数。decorator只接受一个限定符。如果违反合同,将给出以下错误。

contracts.exceptions.OutputContractException: The result of -1 broke the output contract

限定符

限定符是接受单个值并在满足条件时返回True,否则返回False的函数。

为了方便起见,contracts库在一些数据类型上提供了一系列基本限定符。

  • 数字:数字、正数、负数
  • 整数:整数、自然数、正整数、负整数
  • 浮点:浮点、正浮点、负浮点

组成多个限定符

要组合多个限定符,可以导入compose函数,并根据需要传递尽可能多的限定符以生成单个限定符。

fromcontractsimportnatural,positive_integer,compose@ic(val=compose(natural,positive_integer))deffunc(val):returnval

上面的输入协定将检查“val”的参数是否为自然数和正整数。

自定义限定符

库的用户可以插入自己的限定符,只要他们坚持正确的数据签名。如果在整个代码库中使用此库,则在单独的文件中编写限定符集合将保持干净。

构建

合同库是用Python3.6构建的。代码仅在此版本中测试过。与其他版本的兼容性尚未测试。

使用的库:

作者

吉诺·雅各布-Github

非常欢迎反馈。请写下问题。

许可证

这个项目是在麻省理工学院的许可下授权的-详细信息请参见LICENSE.md文件

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

推荐PyPI第三方库


热门话题
java如何使用数据库中的值填充p:selectOneMenu   Java/Junit中的异步单元测试一个非常简单但不成功的例子   在Debian上使用Java连接到MySQL   java测试时如何恢复表中的一条记录/行?   java如何将重点放在jbutton上而不是放在另一个jbutton上?   java我可以从HPROF文件中获取JVM标志吗?   java如何使用自定义比较器在2个集合上保留   java让stringTokenizer将一行文本拆分为预定义变量的最佳方法是什么   Kotlin Android/Java字符串日期时间格式,API21   exchange server EWS Java Api自动发现不工作   netbeans是Java新手,似乎无法修复错误;应为类、接口或枚举。274062   我正在尝试将一些scala代码转换为Java8,以创建新的Lambda和并行集合   流中的分配api(java)   用于串行通信的java Python字节数组