python 装饰器的坑
今天研究了下装饰器,添加重试功能遇到了个坑,跟大家分享一下;
代码如下:
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,但是目前先记下来,日后觅得真理再来更新。
python 装饰器的坑的更多相关文章
- Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案
本文为霍格沃兹测试学院学员学习笔记. Python 装饰器简介 装饰器(Decorator)是 Python 非常实用的一个语法糖功能.装饰器本质是一种返回值也是函数的函数,可以称之为“函数的函数”. ...
- Python装饰器的调用过程
在Python学习的过程中,装饰器是比较难理解的一个应用.本人也在学习期间也遇到很多坑,现将装饰器的基本调用过程总结一下. 首先,装饰器用到了“闭包”,而“闭包”是学习装饰器的基础,所以在讲装饰器之前 ...
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
随机推荐
- Guarded Suspension模式简单实现
Guarded Suspension 意为保护暂停,假设服务器很短时间内承受大量的客户端请求,客户端请求的数量超过服务器本身的即时处理能力,而服务器又不能丢弃任何一个客户端请求,此时可以让客户端的请求 ...
- Qt QSS图片样式切割,三种状态normal,hover,pressed
要切割的样式图片如下: pix_Button->setStyleSheet("QPushButton{ border-image:url(:/image/MyButtonimage/m ...
- Spark开发环境搭建和作业提交
Spark高可用集群搭建 在所有节点上下载或上传spark文件,解压缩安装,建立软连接 配置所有节点spark安装目录下的spark-evn.sh文件 配置slaves 配置spark-default ...
- springboot 依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...
- Axure 部件的交互样式
选中的 时 需要设置事件
- shell脚本编程测试类型上
一bash的条件测试 判断某需求是否满足,需要由测试机制来实现.专用的测试表达式需要由测试命令辅助完成测试过程. 评估布尔声明,以便用在条件性执行中.若真,则返回0:若假,则返回1. 测试命令:• t ...
- 查询qq登陆状态
function qq_status(){ if (empty($qq))$qq = 287959133; $url = 'http://wpa.qq.com/pa?p=2:'.$qq.':52'; ...
- 使用JAVA如何对图片进行格式检查以及安全检查处理
一.通常情况下,验证一个文件是否图片,可以通过以下三种方式: 1).判断文件的扩展名是否是要求的图片扩展名 这种判断是用得比较多的一种方式,不过这种方式非常的不妥,别人稍微的把一个不是图片的文件的扩展 ...
- 探索Redis设计与实现4:Redis内部数据结构详解——ziplist
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- JavaScript--字符串与JSON对象相互转换
JSON.parse() 兼容性:Chrome,Firefox (Gecko) 3.5 (1.9.1),IE 8.0,Safari 4.0 JSON.parse('[1, 5, "false ...