复制
收藏
提问
全网
以下代码有几处错误:def repeat(n): def decorator(func): def wrapper(*args, **kwargs): for _ in range(n): result = func(*args, **kwargs) return result return wrapper return decorator @repeat(3) def greet(name): print(f"Hello, {name}!") greet("Alice")
刚刚
理解问题以下代码有几处错误:def repeat(n): def decorator(func): def wrapper(*args, **kwargs): for _ in range(n): result = func(*args, **kwargs) return result return wrapper return decorator @repeat(3) def greet(name): print(f"Hello, {name}!") greet("Alice")
已完成理解「以下代码有几处错误:def repeat(n): def decorator(func): def wrapper(*args, **kwargs): for _ in range(n): result = func(*args, **kwargs) return result return wrapper return decorator @repeat(3) def greet(name): print(f"Hello, {name}!") greet("Alice")」
展开阅读网页
- 装饰器
repeat
存在逻辑错误。
错误分析
- 循环内不应返回结果:装饰器
repeat
中的wrapper
函数在循环内调用了被装饰的函数func
并接收了返回值,但这个返回值并没有在循环外返回。78 - 装饰器未考虑函数无返回值:如果被装饰的函数没有返回值,
wrapper
函数中的return result
将引发错误,因为result
未定义。7
正确实现
- 应该在循环外返回结果,并且考虑被装饰函数可能没有返回值的情况。
def repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
results = []
for _ in range(n):
result = func(*args, **kwargs)
results.append(result)
return results if results else None
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"Hello, {name}!")
return f"Greeting to {name}"
greet("Alice")
在这个修正的版本中,wrapper
函数收集了所有调用的结果,并在循环结束后返回它们。如果被装饰的函数没有返回值,则 wrapper
返回 None
。78
更专业一些
转笔记
专业
以下代码有几处错误:def repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(n):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"Hello, {name}!")
greet("Alice")不在提醒