按合同编程

deal的Python项目详细描述


Deal
Build StatusCoverage StatusPyPI versionDevelopment StatusCode size

deal–用于design by contract(dbc)编程的python库。

这是很好的assertdecorators风格的语句,可以验证函数输入、输出、可用操作和对象状态。目标是使测试更加容易,并检测代码中偶尔在测试中丢失的错误。

功能

  • 功能声明。
  • 自定义例外。
  • 提出合同的例外。
  • django表单样式验证程序。
  • 属性设置不变验证。
  • 动态分配属性和方法不变验证。
  • 用于控制可用资源的修饰程序:禁止输入/输出、网络操作、引发异常

可用的装饰器

安装

pip3 install --user deal

快速启动

importreimportattrimportdealREX_LOGIN=re.compile(r'^[a-zA-Z][a-zA-Z0-9]+$')classPostAlreadyLiked(Exception):pass@deal.inv(lambdapost:post.visits>=0)classPost:visits:int=attr.ib(default=0)likes:set=attr.ib(factory=set)@deal.pre(lambdauser:REX_LOGIN.match(user),message='invalid username format')@deal.raises(PostAlreadyLiked)@deal.chain(deal.offline,deal.silent)deflike(self,user:str)->None:ifuserinself.likes:raisePostAlreadyLikedlikes.add(user)@deal.post(lambdaresult:'visits'inresult)@deal.post(lambdaresult:'likes'inresult)@deal.post(lambdaresult:result['likes']>0)@deal.puredefget_state(self):returndict(visits=self.visits,likes=len(self.likes))

现在,deal在运行时控制对象的条件和状态:

  1. @deal.inv在post中访问计数的控件总是非负的。
  2. @deal.pre检查用户名格式。我们假设它应该在以前的某个地方被一些漂亮的表单验证,这些表单带有用户友好的错误消息。所以,如果我们在这里传递了无效的登录名,那肯定是开发人员的错误。
  3. @deal.raises表示,唯一可能引发的异常是PostAlreadyLiked
  4. @deal.chain(deal.offline, deal.silent)控制该函数没有网络请求,并且在stderr或stdout中没有输出。所以,如果我们在内部某处发出意外的网络请求,请让我们知道。
  5. deal.post检查get_state的结果格式。因此,所有外部代码都可以确保字段likesvisits始终在结果中表示,并且总是为正值。

如果代码违反某些条件,将引发deal.ContractError的子异常:

p=Post()p.visits=-1# InvContractError:

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

推荐PyPI第三方库


热门话题
如何在不使用java安装outlook的情况下以编程方式创建pst文件?   如何在java中比较泛型方法中的数组?   JavaFXHTML节点元素   java H2数据库要降低的连接设置无效(2019)   安卓 hilt中的java依赖循环   java这个结构什么时候有意义?   带有模式和匹配器的Java正则表达式   来自类变量的java JNI jstring?   尝试从socket读取时发生java非法阻止模式异常   绑定中使用Moxy的java接口映射。xml不能使用多个接口?   java如何仅静音来电铃声而不静音短信   下载时,java无法获取音频进度条   java SavedIntanceState。getBoolean()使我的应用程序崩溃(我想)   java图像的永久位置?   mysql Java:将多个独立脚本重构为一个脚本   在Windows上以Java访问iTunes歌词数据   java改进BaseUrl和API   为什么有必要在OSGi security中为java security manager授予所有权限