规范模式的简单python实现。

sutoppu的Python项目详细描述


苏托普

Pypi VersionPython VersionBuild StatusCoverage StatusProject license

sutopu(英文{em1}$stop中的日语)是规范模式的简单python实现。

什么是规范模式?

Wikipedia

In computer programming, the specification pattern is a particular software design pattern, whereby business rules can be recombined by chaining the business rules together using boolean logic. The pattern is frequently used in the context of domain-driven design.

更多信息:Eric Evans and Martin Fowler article about Specifications

基本用法

安装

$ pip install sutoppu

使用量

fromsutoppuimportSpecificationclassFruit:def__init__(self,color:str,sweet:bool,bitter:bool):self.color=colorself.sweet=sweetself.bitter=bitterclassFruitIsBitter(Specification):description='The given fruit must be bitter.'defis_satisfied_by(self,fruit:Fruit):returnfruit.bitterisTrueclassFruitIsSweet(Specification):description='The given fruit must be sweet.'defis_satisfied_by(self,fruit:Fruit):returnfruit.sweetisTrueclassFruitIsColored(Specification):description='The given fruit must be {color}.'def__init__(self,color):super().__init__()self.color=colorself.description=self.description.format(color=color)defis_satisfied_by(self,fruit:Fruit):returnself.color==fruit.color
>>>lemon=Fruit(color='yellow',sweet=False,bitter=True)>>>is_a_lemon=FruitIsColored('yellow')&FruitIsBitter()&~FruitIsSweet()>>>is_a_lemon.is_satisfied_by(lemon)True

操作员

以及:

>>>my_spec=SpecificationA()&SpecificationB()

或:

>>>my_spec=SpecificationA()|SpecificationB()

不:

>>>my_spec=~SpecificationA()

较轻的语法

如果您觉得is_satisfied_by方法不太方便,也可以直接调用下面的规范。

>>>lemon=Fruit(color='yellow',sweet=False,bitter=True)>>>is_a_lime=FruitIsColored('green')&FruitIsBitter()&~FruitIsSweet()>>>is_a_lime(lemon)False

错误报告

在复杂的规则中,很难知道哪个规范失败了。sutoppu允许在使用后通过获取errors属性列出所有失败的规范。 每次使用规范时,都会重置errors属性。对于每个失败的规范,它都返回一个dict,其中包含key的规范类的名称和value的类中提供的描述。在规范因not条件失败的情况下,描述的前缀是Not ~

>>>apple=Fruit(color='red',sweet=True,bitter=False)>>>is_a_lemon=FruitIsColored('yellow')&FruitIsBitter()&~FruitIsSweet()>>>is_a_lemon.is_satisfied_by(apple)False>>>is_a_lemon.errors{'FruitIsColored':'The given fruit must be yellow.','FruitIsBitter':'The given fruit must be bitter.','FruitIsSweet':'Not ~ The given fruit must be sweet.'}

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

推荐PyPI第三方库


热门话题
java Rest DSL路由无法启动路由,因为同一端点不允许有多个使用者   jvm有没有像JConsole或VisualVM这样的工具可以告诉我“类、对象、引用变量在java中存储在哪里?”   java为什么我的列表中的所有元素看起来都一样?   java运行时。运行shell脚本的exec无法打开文件   JPopupMenu的JMenuItem的java热键   会话在Java中被覆盖   如何在java中去除字符串中的尖锐重音?   java Mockito监视一个接口,模拟它的默认方法,获取NullPointerException   javascript如何在jquery中禁用同一时间选择   将数组列表附加到现有CSV文件,但它会附加并清除存储在Java文件中的以前的数据   java从我的jar中访问pdf文件   java Sonar issue参数必须为非Null,但标记为可为Null   java Salesforce流式API:在网络故障之后和重新订阅之前获取事件   在Java 1.8.0_65上运行Play2.0应用程序时出现playframework错误   java为什么字母的ASCII由方法自动转换。toCharArray()?   java如何知道JDialog是否关闭?   java向服务器发送POST请求,服务器的响应为null,启动   java如何设置JTable中特定单元格的值?   ImagePlus中的java保存问题