def mm2(func): """ 装饰器:循环执行发送/接收,直至成功 """ @wraps(func) def wrapper(*args, **kwargs): while True: try: result = func(*args,**kwargs) break except pynng.exceptions.Timeout: print(func.__name__,'Timeout') continue except pynng.exceptions.TryAgain: print(func.__name__,'TryAgain') continue return result return wrapper() import time from functools import wraps @mm2 def test(n): print(n) if __name__=='__main__': test('1254')
时间: 2024-02-10 20:32:53 浏览: 26
这段代码是一个装饰器函数,名为`mm2`,作用是循环执行函数,直至成功为止。在代码中,使用了`@wraps(func)`来保留被装饰函数的元信息。然后定义了一个无限循环,不断执行被装饰函数,如果执行成功,则跳出循环并返回结果;如果抛出了`pynng.exceptions.Timeout`或`pynng.exceptions.TryAgain`异常,则捕获异常并继续循环执行。最后,返回被装饰函数的执行结果。在代码最后,调用了`test`函数,并传入参数`'1254'`。
相关问题
python 装饰器在wrapper中打印时间使用了 @functools.wraps(func)还会打印两遍的问题
这个问题通常出现在使用了 `@functools.wraps(func)` 修饰装饰器函数时。这是因为 `@functools.wraps(func)` 会将被装饰函数的元信息(比如函数名、参数列表等)复制到装饰器函数中,以便让装饰器函数看起来像是被装饰函数本身。但是,如果你在装饰器函数中也使用了 `@functools.wraps(func)` 修饰函数,那么这个过程就会重复进行,导致元信息被复制两次,从而打印两次时间。
解决这个问题的方法是在装饰器函数中只使用一次 `@functools.wraps(func)`,并将其放在最外层的函数上方。例如:
```python
import functools
import time
def timeit(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} took {(end_time - start_time):.6f}s")
return result
return wrapper
```
这样,`@functools.wraps(func)` 只会被调用一次,元信息只会被复制一次,打印时间也只会出现一次。
@wraps(func) def wrapper(self): > return func(self, *args, **kwargs) E TypeError: test_excel01() missing 1 required positional argument: 'password'这段报错要怎么解决
这个错误是由于 `test_excel01()` 函数没有传递必需的 `password` 参数而导致的。要解决这个问题,你需要在 `test_excel01()` 函数中添加一个 `password` 参数,或者修改测试数据,确保测试数据中包含 `password` 参数。你也可以检查测试方法的代码,确保传递了正确的参数。如果你使用的是 `ddt` 模块进行数据驱动测试,那么你需要确保测试数据中包含 `password` 参数,并且在 `@data` 装饰器中正确地指定了参数的位置。例如:
```python
@ddt
class ExcelText(unittest.TestCase):
@data(*get_data_from_excel())
@unpack
def test_excel01(self, username, password):
# your test code here
```
在这个例子中,`password` 参数被指定为第二个元素,因此在测试数据中需要确保第二列包含密码信息。