今天研究了下装饰器,添加重试功能遇到了个坑,跟大家分享一下;

代码如下:

 def re_try(maxtry):
print locals()
def wrapper(fn):
print locals()
def _wrapper(*args, **kwargs):
print locals()
while maxtry > 0:
try:
return fn(*args, **kwargs)
except Exception as e:
print e.message
maxtry -= 1
return _wrapper
return wrapper @re_try(4)
def test(a, b):
# return a+b
if DEC == 2:
return a+b
else:
raise WrapException def main():
print test(3,5) if __name__ == '__main__':
main()

运行的结果如下:

{'maxtry': 4}
{'fn': <function test at 0x024B5170>}
{'args': (3, 5), 'fn': <function test at 0x024B5170>, 'kwargs': {}}
Traceback (most recent call last):
File "D:\myGit\test\testWrapp.py", line 58, in <module>
main()
File "D:\myGit\test\testWrapp.py", line 55, in main
print test(3,5)
File "D:\myGit\test\testWrapp.py", line 17, in _wrapper
while maxtry > 0:
UnboundLocalError: local variable 'maxtry' referenced before assignment

按道理maxtry这个变量会一直存在再整个装饰器运行过程中,但是我们看到在第4行 和第6 行并没有看到该变量,本农百思不得七姐,于是就瞎调试,终于实现了功能。

 def re_try(max_try):
print locals()
def wrapper(func):
print locals()
@wraps(func)
def _wrapper(*args, **kw):
print locals()
for i in xrange(max_try):
try:
res = func(*args, **kw)
if res is None:
continue
else:
return res
except Exception as e:
print e.message
return _wrapper
return wrapper @re_try(4)
def test(a, b):
# return a+b
if DEC == 2:
return a+b
else:
raise WrapException def main():
print test(3,5) if __name__ == '__main__':
main()

把while 循环改成了for循环,得到如下运行结果:

{'max_try': 4}
{'max_try': 4, 'func': <function test at 0x02613170>}
{'args': (3, 5), 'kw': {}, 'func': <function test at 0x02613170>, 'max_try': 4}

虽然目前还不知道为什么装饰器内部函数里面不能使用while,但是目前先记下来,日后觅得真理再来更新。

最新文章

  1. .NET平台下对C3D文件的读写
  2. margin:0 auto 与 text-align:center
  3. C#调用Java方法(详细实例)
  4. block的使用
  5. OpenCV成长之路(3):模仿PhotoShop中魔术棒工具
  6. [原创] 在spring 中使用quarts
  7. Distributed Sentence Similarity Base on Word Mover&#39;s Distance
  8. 【转】Session与Cookie的比较
  9. leetcode@ [300] Longest Increasing Subsequence (记忆化搜索)
  10. 代码编写横屏的UIView
  11. Android Studio常用插件
  12. 使用pymysql和paramiko实现远程安装软件
  13. python3 获取阿里云ECS 实例及监控的方法
  14. js extend的实现
  15. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 连接数据库执行SQL语句
  16. oss上传和下载的笔记
  17. swift 学习- 19 -- 可选链式调用
  18. VMware 2017 v14.x 永久许可证激活密钥
  19. docker学习笔记-安装
  20. 《高性能Mysql》讲聚簇索引

热门文章

  1. 2019HDU多校训练第三场 Planting Trees 暴力 + 单调队列优化
  2. wireshark简单的过滤条件
  3. HWDB手写汉字识别 - CNN
  4. Laravel框架中如何使用事件记录SQL查询到日志
  5. 百度地图,删除marker,创建marker
  6. shell cut从一个文件中提取列
  7. 阿里云公共DNS正式发布支持IPv6的版本
  8. Python--nfs服务+计划任务crond服务+shell介绍
  9. UVA 10529 - Dumb Bones (概率dp)
  10. What size do you use for varchar(MAX) in your parameter declaration?