python 装饰器的坑
2024-08-31 12:44:18
今天研究了下装饰器,添加重试功能遇到了个坑,跟大家分享一下;
代码如下:
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,但是目前先记下来,日后觅得真理再来更新。
最新文章
- .NET平台下对C3D文件的读写
- margin:0 auto 与 text-align:center
- C#调用Java方法(详细实例)
- block的使用
- OpenCV成长之路(3):模仿PhotoShop中魔术棒工具
- [原创] 在spring 中使用quarts
- Distributed Sentence Similarity Base on Word Mover&#39;s Distance
- 【转】Session与Cookie的比较
- leetcode@ [300] Longest Increasing Subsequence (记忆化搜索)
- 代码编写横屏的UIView
- Android Studio常用插件
- 使用pymysql和paramiko实现远程安装软件
- python3 获取阿里云ECS 实例及监控的方法
- js extend的实现
- BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 连接数据库执行SQL语句
- oss上传和下载的笔记
- swift 学习- 19 -- 可选链式调用
- VMware 2017 v14.x 永久许可证激活密钥
- docker学习笔记-安装
- 《高性能Mysql》讲聚簇索引
热门文章
- 2019HDU多校训练第三场 Planting Trees 暴力 + 单调队列优化
- wireshark简单的过滤条件
- HWDB手写汉字识别 - CNN
- Laravel框架中如何使用事件记录SQL查询到日志
- 百度地图,删除marker,创建marker
- shell cut从一个文件中提取列
- 阿里云公共DNS正式发布支持IPv6的版本
- Python--nfs服务+计划任务crond服务+shell介绍
- UVA 10529 - Dumb Bones (概率dp)
- What size do you use for varchar(MAX) in your parameter declaration?