装饰器这个为啥报错了
import timedef fib():
back1, back2 = 0, 1
def func():
nonlocal back1, back2
back1, back2 = back2, back1 + back2
print(back1, end=' ')
return func
def sleeptime(fun):
def call_time():
start = time.time()
fun()
time.sleep(2000)
end = time.time()
print(f'{end-start}')
return call_time
@sleeptime
def get_fib(n):
f = fib()
for i in range(n):
f()
n = int(input("请输入需要获取的斐波那契数:"))
get_fib(n)
请输入需要获取的斐波那契数:5
Traceback (most recent call last):
File "D:\python\python_test\装饰器.py", line 42, in <module>
get_fib(n)
TypeError: call_func() takes 0 positional arguments but 1 was given 程序试图调用函数get_fib(n),但它被一个名为sleeptime的装饰器包装了起来,该装饰器用另一个可调用对象call_time()包装了该函数。 call_time()函数不接受任何参数,并期望另一个没有参数的函数fun()被调用。
因此,要修复错误,应将函数get_fib()修改为不带参数的函数,并且应该将参数n作为参数传递给fib()方法返回的函数。 这个错误是因为 `call_time` 函数在调用 `fun()` 时,没有传入任何参数,但是 `get_fib()` 调用了 `call_time` 并传入了一个参数 `n`。可以通过给 `call_time` 函数添加一个 `*args, **kwargs` 参数来接受传入的参数,并将其传递给 `fun()` 函数:
def sleeptime(fun):
def call_time(*args, **kwargs):
start = time.time()
fun(*args, **kwargs)
time.sleep(2)
end = time.time()
print(f'{end-start}')
return call_time
这样修改后可以正常运行,并且会在调用完 `fib()` 函数后停顿 2 秒钟。
有用请设置最佳答案 sfqxx 发表于 2023-4-16 15:14
这个错误是因为 `call_time` 函数在调用 `fun()` 时,没有传入任何参数,但是 `get_fib()` 调用了 `call_ti ...
为什么最佳答案是你的 歌者文明清理员 发表于 2023-4-16 15:17
为什么最佳答案是你的
因为所以科学道理 歌者文明清理员 发表于 2023-4-16 15:17
为什么最佳答案是你的
这要问楼主
页:
[1]