灵活,简洁

preconditions的Python项目详细描述


preconditions-依赖于 参数名等价性以实现简洁性和一致性。

示例

首先让我们来看看例子。所有的例子都假设 preconditionsdecorator已导入:

frompreconditionsimportpreconditions

基本类型检查

double应用程序函数要求i参数 是一个int,由一个^{tt6}谓词验证$ 表达式):

@preconditions(lambdai:isinstance(i,int))defdouble(i):return2*i

多个谓词

可以指定多个谓词:

@preconditions(lambdai:isinstance(i,int),lambdai:i>0,)defdouble(i):return2*i

注意,这在功能上等同于这个谓词 版本:

@preconditions(lambdai:isinstance(i,int)andi>0,)defdouble(i):return2*i

多谓词版本应该(最终)具有更具体的 错误报告失败,而单个谓词版本可能 提高效率。

多个参数

多个谓词可以表示多个参数的前置条件:

@preconditions(lambdas:isinstance(s,unicode),lambdan:isinstance(n,int)andn>=0,)defrepeat(s,n):returns*n

然而,single谓词可以表示多个 论据。这允许关系先决条件

@preconditions(lambdaa,b:a<=b)defstrict_range(a,b):returnrange(a,b)

方法前提条件

可以表示方法的谓词,包括 self。例如,Monotonic实例确保每次调用 .set必须传递一个大于以前任何调用的值:

classMonotonic(object):def__init__(self):self.v=0@preconditions(lambdaself,v:v>self.v)defset(self,v):self.v=v

前置条件可以应用于特殊方法,例如__new____init____call__等。

classLinearRange(tuple):@preconditions(lambdaa:isinstance(a,float),lambdab:isinstance(b,float),lambdaa,b:a<b,)def__new__(cls,a,b):returnsuper(OrderedTuple,cls).__new__(cls,(a,b))@preconditions(lambdaw:0<=w<1.0)def__call__(self,w):lo,hi=selfreturnw*(hi-lo)+lo@preconditions(lambdax:self[0]<=x<self[1])definvert(self,x):lo,hi=selfreturn(x-lo)/(hi-lo)

概念

应用函数可以用先决条件来保护 谓词。这些谓词是传递给 preconditions装饰器。请考虑以下代码:

@preconditions(lambdaa:isinstance(a,float)anda>=0,lambdab:isinstance(b,float)andb>=0,)defarea(a,b):returna*b

应用程序函数是area,它定义了两个谓词 使用lambda,每个参数都确保其中一个参数是 非负浮点数。

参数名等价性

谓词中的参数名必须与 应用程序功能。这就是所谓的参数名等价性。 [1]

[1]This is a bit magical, relying on function introspection. The design assumes the conciseness and consistency benefits outweigh the potential confusion of “magic”.

此规则的一个例外是 谓词。默认参数可用于关联 谓词定义时间。例如:

scores={}@preconditions(lambdacolor,_colors=['RED','GREEN','BLUE']:colorin_colors)defget_color_score(color):returnscores[color]

当需要记住 局部循环变量。

类似项目

covenant-python 3的代码契约。

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

推荐PyPI第三方库


热门话题
java如何使用jsonb库从Postgres读取jsonb   java如何在SeleniumWebDriver中选择下拉选项?   java如何获取需要在tessbase中使用的目录。init(“目录”,“eng”)?   java计算二进制字的奇偶校验   java如何使用jBCrypt进行密码哈希比较?   eclipse的java分析器插件   在java中调用C函数   java在嵌入式Apache Tomcat 9中以编程方式启用SSL并添加证书   java在中遇到问题。nextDouble()   java如何为JScrollPane的视口绘制引导标记   swing Java组件在启动时不显示   有没有类似java的C语言。util。属性类