某个功能operation
,外部服务和有时失败。我想在放弃之前尝试N
次。出于这个原因,我将重试代码编写为装饰器,现在我想对其进行单元测试。
我为可能出错的操作创建了一个简单的模型函数:函数失败,N-1
次异常,并且N
次成功。
这是代码:
def mock(retry):
def repl(*xs, **ks):
if retry == 0:
return 1
retry -= 1
raise error('boom')
return repl
这就是我想要应用它的方式:
somemodule.library.operation = mock(N - 1)
somemodule.run() # calls somemodule.library.operation
出乎意料的是,通过运行mock(N -1)()
我在if retry == 0
行上收到以下错误:
UnboundLocalError: local variable 'retry' referenced before assignment
在试图理解原因后,我发现错误会在我摆脱retry -= 1
行后立即消失。
我对这个事实感到有点困惑,因为在我看来,retry
变量应该完全属于mock
范围,而不仅仅是以只读方式访问它。如果有的话,我应该总是得到错误,不仅仅是我修改它。
为什么这是一个问题?您认为正确的做法是什么?
注意:
global retry
条件if retry == 0