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 09:32:53 浏览: 68
这段代码是一个装饰器函数,名为`mm2`,作用是循环执行函数,直至成功为止。在代码中,使用了`@wraps(func)`来保留被装饰函数的元信息。然后定义了一个无限循环,不断执行被装饰函数,如果执行成功,则跳出循环并返回结果;如果抛出了`pynng.exceptions.Timeout`或`pynng.exceptions.TryAgain`异常,则捕获异常并继续循环执行。最后,返回被装饰函数的执行结果。在代码最后,调用了`test`函数,并传入参数`'1254'`。
相关问题
from functools import wraps # 装饰器,用于计算函数执行时间 def timer(func): @wraps(func) def wrapper(*arg
`from functools import wraps` 这段代码是在 Python 中导入 `functools` 模块下的 `wraps` 函数,`wraps` 是一个装饰器工具函数,常用于创建其他装饰器。装饰器本质上是一个返回新函数的高阶函数,它可以修改或增强原函数的行为。
在这个例子中,`timer` 函数就是一个装饰器,它接收一个函数 `func` 作为输入。这个装饰器的工作原理是:
1. `@wraps(func)`:这行代码应用了 `wraps` 函数到 `timer` 函数内部的 `wrapper` 函数上,这样 `wrapper` 就会保留原始函数 `func` 的名称、文档字符串等元信息,有助于保持代码的整洁和调试。
2. `def wrapper(*args, **kwargs):`:这是内部定义的包装函数 `wrapper`,它接受任意数量的位置参数 (`*args`) 和关键字参数 (`**kwargs`)。当用户调用被装饰的函数时,实际上是调用了这个 `wrapper` 函数。
`wrapper` 函数内部通常会对被装饰的函数先执行计时操作,然后再调用该函数,并处理返回值。例如,可以添加开始和结束时间的记录,以及计算并打印执行时间。最后,`wrapper` 返回的结果就是被装饰后的函数执行结果。
要使用这个装饰器,只需将需要计算执行时间的函数传给 `timer`,如 `@timer` 声明在函数定义之前,如:
```python
import time
@timer
def my_function():
# 函数体...
time.sleep(2)
my_function()
```
运行上面的代码,将会在控制台看到函数执行的时间。
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)` 只会被调用一次,元信息只会被复制一次,打印时间也只会出现一次。
阅读全文