范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Python进阶精华编写装饰器为被包装的函数添加参数

  此方法主要目的就是为了给被包装函数添加额外参数:实例如下:from functools import wraps def option_debug(func):     @wraps(func)     def wrapper(*args,debug=False,**kwargs):         if debug:             print("Calling:",func.__name__)         return func(*args,**kwargs)     return wrapper  @option_debug def add(x,y,z):     return x+y+z print(add(1,2,3,debug=True)) #理解装饰器,实质上就只要理解了下述代码,就不难了: f = option_debug(add)(1,2,3,debug=True) print(f)
  注意:这种发方法并不是装饰器最常用的功能,但是在降低代码重复上可谓是首屈一指。比如:如果不使用装饰器,上述代码可能会很多:def add(x,y,z,debug=False): 	if debug: 		print("calling:") 	return x+y+z def sub(x,y,z,debug=False): 	if debug: 		print("calling:") 	return x-y-z def mult(x,y,z,debug=False): 	if debug: 		print("calling:") 	return x*y*z #等等诸多函数,都需要一个一个的去设置debug的情况, #而有了装饰器,这些内容仅仅需要写一次就可以在很多函数中使用。
  当然,这里也有一个潜在的风险,就是当装饰器包裹的函数已经用了debug作为参数名,那么装饰器这里将会报错,所以要添加额外的一些判断来完善代码:from functools import wraps import inspect  def option_debug(func):     if "debug" in inspect.getargspec(func).args:         raise TypeError("debug argument already defined")     @wraps(func)     def wrapper(*args,debug=False,**kwargs):         if debug:             print("Calling:",func.__name__)         return func(*args,**kwargs)     return wrapper  @option_debug def add(x,y,debug):     return x+y,debug  print(1,2,"True") """ # 会出现如下异常: Traceback (most recent call last):   File "F:/PycharmProjects/class_obj/class_one.py", line 962, in      @option_debug   File "F:/PycharmProjects/class_obj/class_one.py", line 954, in option_debug     raise TypeError("debug argument already defined") TypeError: debug argument already defined (该参数已经被在装饰器中定义了,不能重复定义)  Process finished with exit code 1 """
  最后还剩下一部分比较难理解的地方,我将理解的注释在每行代码上方,这个问题就是,在打印被修饰函数的参数签名时,其实并不能正确显示参数签名,原因是因为被wrapper修饰过后的函数实际上应该使用的是wrapper的参数签名表,例如:@option_debug def add(x,y):     return x+y  print(inspect.signature(add))  # (x, y) 实际上应该是(x,y,*,debug=False)
  所以,接下来,完成最后最难的一步:from functools import wraps import inspect def option_debug(func):     if "debug" in inspect.getargspec(func).args:         raise TypeError("debug argument already defined")     @wraps(func)     def wrapper(*args,debug=False,**kwargs):         if debug:             print("Calling:",func.__name__)         return func(*args,**kwargs)      #获取修饰的函数的参数签名表并且返回一个有序字典(顺序依照实际函数参数顺序)对象     #这个字典本质上是有一个存放了元组(元组中存放的是参数名和参数地址两个属性)的列表通过Orderdict转化而来     sig = inspect.signature(func)#signature允许我们从函数中抽取参数签名出来     parms = list(sig.parameters.values())#将参数信息表的值列表化     #sig.paramenters实际就是字典,通过键(参数名)可以找到该参数所有的属性例如下一行中:     parms.append(inspect.Parameter("debug",kind=inspect.Parameter.KEYWORD_ONLY,default=False))#追加一个新的参数信息进去     wrapper.__signature__ = sig.replace(parameters=parms)#替换原有参数信息,并且修改wrapper的参数签名表      return wrapper  @option_debug def add(x,y):     return x+y  print(inspect.signature(add)) # (x, y, *, debug=False)

被称为下一个铃木的斯巴鲁汽车发布首款纯电车,预计明年国内上市日本汽车品牌斯巴鲁今日公开了该公司旗下首款纯电动车Solterra,并宣布其将在2022年正式量产上市,登陆日本欧洲北美和中国市场。Solterra将使用和丰田共同开发的平台,该平中国新能源汽车未来五年增速将达40,建立自主芯片产业迫在眉睫近年来,随着需求的增加和技术的进步,中国新能源汽车产业达到了快速的发展。根据中国汽车工业协会(中汽协)统计,今年15月,国内新车销量1087。5万辆,其中新能源汽车销量95万辆,同苹果手机丢了第一时间竟不是报警?其实这个文章老早该更新了,因为苹果设备方面卖的比较多,一年到头总能碰到很多问我苹果手机丢了,不知道怎么办的朋友,文章最后才是重点确认位置像我妈这种人手机从来不喜欢放在口袋,随手一扔2021年哪款ipad性价比最高?M1芯片的ipadpro值得买么?本篇文章主要是作为推荐文,不是科普文,会直接按照需求告诉你应该选哪款ipad如果想看科普文的,了解各个不同型号的详细区别,可以看下文章最下方的往期文章(需要一对一咨询推荐的可以入我让小白都能理解有锁机卡贴机黑解机区别,另外说这种手机能买么我认为只要在网上购买iPhone手机,都可以了解一下这个文章。因为不止一次有顾客在网上买手机,碰到商家将有锁的iPhone当无锁的卖给顾客何为无锁?无锁最简单理解,你在官网买的那种手机店老板永远不会说的秘密维修篇一在大街上能换到苹果手机原装的电池么?不能苹果的原装电池从未授权过任何第三方,也没有对外进行过出售,原装电池只有官方直营店或者授权维修中心才能换到例如百邦,天音这种你能在官网查到的2020年iPhonexr还值得购买么?先说结论,非常值得介绍一下小编背景,从事的苹果手机行业,本人苹果手机使用历程是从4s6p7p8pxmaxpromax,就基本是每年都换每款都体验过,个人认为在苹果手机选购方面还是比比国行便宜将近2000块钱的iPhone黑解机到底是什么?iPhone12promax全新国行目前3月28号京东报价是8759我们渠道拿货价也在8500左右但是黑解机今天拿货价格仅需6500左右!!同样全新的手机为什么差价能有2000?这国货之光华为freebudspro蓝牙耳机测评我从2014年开始一直用的苹果全家桶设备了,除了去年买过一台小米10,这么多年没用过安卓设备了,今天测试了华为的freebudspro无线耳机,让我改变了对于国产数码的看法,使用体哪款ipad是2021年千元ipad中的性价比之王?2021年有没有什么一千多的ipad,屏幕大,能看网课,能打游戏,最好还能是大内存有这种ipad么?还真有那就是苹果的一代神机ipadair2它有三个优点一处理器在我们参数表上可以91十条文远知行估值超200亿,上汽将推电池银行,货拉拉或造车1文远知行C轮融资数亿美元,投后估值约合人民币212亿元。包括IDG资本和创投资基石资本CypressStar云九资本K3Ventures等,老股东CMC资本启明创投瓴峰资本等继续
扫地机器人是神器还是鸡肋?我家买了3台,终于搞明白了畅谈关于装修的那些事,分享装修的各种经验和知识。大家好,我是畅谈装修,关注我即可了解更多关于装修的那些事!扫地机器人号称是解放双手的家庭清洁神器,而且目前行业正处在快速发展期,机器授权验号接口极速验号接口授权精准验号接口获取cookie接口授权验号接口极速验号接口照妖镜接口验号接口授权精准验号接口获取cookie接口获取订单列表接口接口作用介绍用户授权给商家查看该账号是否符合参与引流活动,该接口用户获取授权二维码链接电脑告别Windows?国产系统实现14秒开机按下开机键,电脑启动,黑色屏幕上渐渐浮现出的图标并非过去的Windows,而是统信UOS。统信UOS正是在京研发的新一代国产计算机操作系统。近日,搭载着统信操作系统的笔记本电脑实现2022年最佳选择红米K40S发布,红米K40低至乞丐价,低价无底线总结来看2022年的最佳选择红米K40S新手机是一款不可忽视的存在,总结来看2022年的最佳选择红米K40S新手机这款机型发布之后,总结来看2022年的最佳选择红米K40S新手机直iOS15。4耗电发热,使用两天后,我的iPhone13pro成功自愈了大家好我是共醉明月,今天继续聊聊苹果iOS15。4正式版的问题,在iOS15。4正式版推送后,虽然有不错的戴口罩解锁功能,但同时也带来了不小的副作用,很多用户的iPhone手机再升又一芯片代工龙头回归A股!华虹半导体冲刺科创板文福布斯中国华虹半导体拟冲刺科创板,引爆半导体行业。3月21日,华虹半导体(01347。HK)公布,于2022年3月21日,董事会批准可能发行人民币股份及将该等人民币股份在科创板上谁在承担网络暴力的恶果从近几年发生的情况来看,网络暴力并非只发生在中国的互联网场域内,可以说,这是一个全球性的问题。在很多国家的互联网上,攻击性煽动性侮辱性的言论随处可见,尤其是在针对某一事情的观点发生超4000元的骁龙778G手机,卖点被余承东公开!是不是低估了花粉?在华为举行的2022年华为全场景新品发布会上,华为P50E也正式亮相了。对于在手机业务上频频陷入困境的华为来说,能够出一款手机相当不容易。因此,尽管是一款4G手机,华为P50E的关大厂青年滴滴继续裁员万门教育跑路京东零售V事业群解散1滴滴又要裁员啦,躲得了初一,躲不了十五,逃得过2月,逃不过3月,听说后面还会有几轮。2万门教育关门跑路了,员工一觉醒来App上不去,vip群解散,工资还没发最狗的是解散群专挑半夜真我今天发布的真我gtneo3值不值得,了解一下一价格真我gtneo36128GB1999元,8128GB2299元,12256GB2599元150W版本首销限时直降,8256GB到手2599元,12256GB到手2799元红米iPhone14进一步确认,库克刀法精准,老果粉福利来了其实在手机市场上啊,过快的手机产品发展确实有时候不是一件好事情,像现在在手机市场上的苹果手机产品,其的市场发展节奏就能说是有点过于快了。也许是这两年的社会生活中,被塞下了太多的信息