深圳营销型网站,怎么在手机上制作app,WordPress网络功能,wordpress架设服务器分类目录#xff1a;《系统学习Python》总目录 让我们从基本的范围测试实现开始。为了简化步骤#xff0c;起初我们将编写一个只对位置参数有效的装饰器#xff0c;并且假设这些参数在每次调用中总是出现在相同的位置。位置参数不能通过关键字名称传递#xff0c;并且我们在…分类目录《系统学习Python》总目录 让我们从基本的范围测试实现开始。为了简化步骤起初我们将编写一个只对位置参数有效的装饰器并且假设这些参数在每次调用中总是出现在相同的位置。位置参数不能通过关键字名称传递并且我们在调用中不支持额外的**args关键字因为这可能导致装饰器中的位置声明无效
def rangetest(*argchecks):def onDecorator(func):if not __debug__:return funcelse:def onCall(*args):for (ix, low, high) in argchecks:if args[ix] low or args[ix] high:errmsg Argument %s not in %s-%s % (ix, low, high)raise TypeError(errmsg)return func(*args)return onCallreturn onDecorator算是老调重弹这段代码略微修改了我们前面介绍的编程模式我们使用装饰器参数、嵌套作用域来进行状态保持等等。
就像在前面的文章中学习到的我们还使用了嵌套的def语句以确保这个装饰器对简单函数和方法都有效。当用于类的方法时oncall在*args中的第一项接受主体类的实例并且将其传递给最初的方法函数中的self在这个例子中范围测试中的参数数目从1开始而不是从0开始。
注意这里的新情况这段代码使用了__debug__内置变量一一滁非用·O优化命令行标志运行它例如python -O main.py否则都会将其设置为True。当__debug__为False的时候装饰器返回未修改的最初函数以避免额外调用及其相关的性能损失。换言之当使用·0时装饰器自动移除其扩增逻辑而不会要求你在编辑器中移除装饰代码。第一次迭代解决方案使用如下
rangetest((1, 0, 120))
def personinfo(name, age):print(%s is %s years old. % (name, age))rangetest([0, 1, 12], [1, 1, 31], [2, 0, 2099])
def birthday(M, D, Y):print(birthday {0}/{1}/{2}.format(M, D, Y))class Person:def __init__(self, name, job, pay):self.job jobself.pay payrangetest([1, 0, 1])def giveRaise(self, percent):self.pay int(self.pay * (1 percent))然后我们可以测试各种情况下的输入
personinfo(Bob Smith, 45)输出
Bob Smith is 45 years old.输入 personinfo(Bob Smith, 150)输出
TypeError Traceback (most recent call last)
Input In [17], in cell line: 1()
---- 1 personinfo(Bob Smith, 150)Input In [14], in rangetest.locals.onDecorator.locals.onCall(*args)8 if args[ix] low or args[ix] high:9 errmsg Argument %s not in %s-%s % (ix, low, high)
--- 10 raise TypeError(errmsg)11 return func(*args)TypeError: Argument 1 not in 0-120
输入
birthday(12, 31, 2000)输出
birthday 12/31/2000输入
birthday(13, 31, 2000)输出
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [19], in cell line: 1()
---- 1 birthday(13, 31, 2000)Input In [14], in rangetest.locals.onDecorator.locals.onCall(*args)8 if args[ix] low or args[ix] high:9 errmsg Argument %s not in %s-%s % (ix, low, high)
--- 10 raise TypeError(errmsg)11 return func(*args)TypeError: Argument 0 not in 1-12输入
sue Person(Sue Jones, dev, 100000)
sue.giveRaise(0.1)
print(sue.pay)输出
110000输入
sue.giveRaise(1.1)
print(sue.pay)输出
TypeError Traceback (most recent call last)
Input In [23], in cell line: 1()
---- 1 sue.giveRaise(1.1)2 print(sue.pay)Input In [14], in rangetest.locals.onDecorator.locals.onCall(*args)8 if args[ix] low or args[ix] high:9 errmsg Argument %s not in %s-%s % (ix, low, high)
--- 10 raise TypeError(errmsg)11 return func(*args)TypeError: Argument 1 not in 0-1
参考文献 [1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.