看到廖雪峰python教程上,python装饰器一章

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000

在最后的作业题上

再思考一下能否写出一个@log的decorator,使它既支持:

@log
def f():
pass

又支持:

@log('execute')
def f():
pass

即在装饰器头上加str,从而牵扯出了一个装饰器参数传入的问题。

讨论区有人留言

用户6223899516_84125 created at 6天前, Last updated at 6天前
import functools
import time def log2(text=None):
def decorator(func):
@functools.wraps(func)
def wrapper(*args,**kw):
if isinstance(text,(int,str)):
print('%s begin call %s():' %(text,func.__name__))
func(*args,**kw)
print('%s end call %s():' %(text,func.__name__))
else:
print('begin call %s():' % func.__name__)
func(*args,**kw)
print('end call %s():' % func.__name__)
return
return wrapper
return decorator if isinstance(text,(int,str)) else decorator(text) @log2
def now2():
print('now is:'+time.asctime()) now2() @log2('timeshow')
def now3():
print('now is:'+'2017-07-10') now3()

最后的if语句其实我是参考其他人的,但是我突然觉得很不理解, 为什么if有参数的时候是 return decorator, 而else(无参数)的时候是 return decorator(text)

谁能给解释一下。。我怎么总觉得写反了呢?不过从结果来看是对的~

以及下面的回复

在调试里面跑了一下,不写参数的时候,text拿到的实际是函数对象,就是本来func应该拿到的那个,结果让text提前吃掉了,截胡了你程序里的now。

这里不写字符串的话,text不会拿到None,而是直接被赋值成函数。调试里面跑到这一步,text的属性是指向一个function。

如果把return里面那个decorator(text) 直接改成decorator,执行会提示缺参数。因为内层的func这个量已经没参数可接了。

decorator(text) 的意思就是,如果发现text不是str类型,那么就是本该传给内层func的函数让外层提前拿走了,并且放在了text里面。这时应该手动把text传给里面那层,于是就return了 decorator(text)


通过这个问题,大概搞明白装饰器参数传入的问题了。
python应该会从外层向内层逐层匹配。

最新文章

  1. ABP框架 - 领域服务
  2. 51Nod 1021 石子合并 Label:Water DP
  3. Lazarus -Pascal常量
  4. Tomcat启动时为什么要配置CATALINA_HOME环境变量??
  5. MaxReceivedMessageSize :已超过传入消息(65536)的最大消息大小配额
  6. 【HDOJ】1011 Starship Troopers
  7. USB HID Report Descriptor 报告描述符详解
  8. 深入理解7816(5)-----关于文件DF/EF/MF/FID/AID/SFI
  9. javascript---在自由落体实现
  10. jquery背景动画插件使用
  11. enode框架step by step之saga的思想与实现
  12. 用http-server 创建node.js 静态服务器
  13. 一款简洁而强大的前端框架JQUery—动画效果及剪刀石头布小游戏
  14. Animation-list,帧动画+属性动画,做出Flash般的效果
  15. php 快排
  16. winfrom程序Datagridview列名问题
  17. C++标准模板类库(STL)之queue初步
  18. php的一些算法题
  19. Spring cloud info信息显示
  20. thinkcmf 角色授权支持分类

热门文章

  1. js构造方法
  2. OpenGL小试牛刀第二季(粒子模拟)
  3. MyBatis归纳
  4. JAVA并发编程:相关概念及VOLATILE关键字解析
  5. Python——for表达式
  6. javaweb基础(13)_session防止表单重复提交
  7. 用Windows Native API枚举所有句柄及查找文件句柄对应文件名的方法
  8. iOSAES加密的实现
  9. DD命令做备份和恢复
  10. Python的ORM介绍