python - 当我使用带参数的python装饰器时,如何将参数传递给最里面的函数?
问题描述
当 func 返回不是 True 时,这是我的召回 func 装饰器
def deco_retry(retry_times):
def _deco_retry(func):
def wrapper(*args, **kwargs):
while retry_times > 0:
ret = func(*args, **kwargs)
if ret:
return ret
retry_times -= 1
return wrapper
return _deco_retry
@deco_retry(retry_times=1)
def func(ok=1):
if ok == 1:
return True
else:
return False
当我调用 func() 时,发生错误:
Traceback (most recent call last):
File "E:/Charles/Code/pycharmprj/Huobi/test_code/decorator_test.py", line 26, in <module>
func()
File "E:/Charles/Code/pycharmprj/Huobi/test_code/decorator_test.py", line 10, in wrapper
while retry_times > 0:
UnboundLocalError: local variable 'retry_times' referenced before assignment
为什么我不能retry_times
在最里面的函数中引用:包装器,我该如何纠正这个错误?
解决方案
retry_times
这是因为您稍后在函数中重新分配retry_times -= 1
,因此使其成为局部变量。
nonlocal
您可以在 while 循环上方添加(如果是 python3):
def _deco_retry(func):
def wrapper(*args, **kwargs):
nonlocal retry_times
while retry_times > 0:
或者while
,您可以尝试使用循环而不是使用循环range
:
def wrapper(*args, **kwargs):
for _ in range(retry_times):
ret = func(*args, **kwargs)
if ret:
return ret
应该工作相同,并且您不必乱加/减去重试次数。
推荐阅读
- mysql - 全新 Lucee 5.2.7.63 安装无法连接到全新 MySQL 8 安装
- asp.net - 如何获取在 ASP.NET MVC 中呈现部分视图的 .cshtml 文件的文件名?
- ios - 将焦点从 UITextView 更改为 UITextField 会破坏约束
- python - 在 Python 中使用权重拟合对数正态分布的正确方法
- sql - 使用子查询和联接的 SQL 查询性能
- excel - VBA,格式化/未知问题导致 vba 无法工作
- dataset - 用于物体检测和分类的 kitti 数据集 3D 激光雷达点云数据
- mysql - 在 Rails 中使用英语模型和西班牙语数据库
- python - Python:根据位置、括号和括号从列表中获取每个元素
- javascript - 我可以使用中继更新器配置来更新简单的 graphQL 列表吗?