灵活,简洁
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的代码契约。