hcm666 发表于 2023-4-16 15:08:07

装饰器这个为啥报错了

import time


def 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

歌者文明清理员 发表于 2023-4-16 15:10:10

程序试图调用函数get_fib(n),但它被一个名为sleeptime的装饰器包装了起来,该装饰器用另一个可调用对象call_time()包装了该函数。 call_time()函数不接受任何参数,并期望另一个没有参数的函数fun()被调用。

因此,要修复错误,应将函数get_fib()修改为不带参数的函数,并且应该将参数n作为参数传递给fib()方法返回的函数。

sfqxx 发表于 2023-4-16 15:14:42

这个错误是因为 `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 秒钟。
有用请设置最佳答案

歌者文明清理员 发表于 2023-4-16 15:17:19

sfqxx 发表于 2023-4-16 15:14
这个错误是因为 `call_time` 函数在调用 `fun()` 时,没有传入任何参数,但是 `get_fib()` 调用了 `call_ti ...

为什么最佳答案是你的

sfqxx 发表于 2023-4-16 15:17:49

歌者文明清理员 发表于 2023-4-16 15:17
为什么最佳答案是你的

因为所以科学道理

liuhongrun2022 发表于 2023-4-16 18:04:24

歌者文明清理员 发表于 2023-4-16 15:17
为什么最佳答案是你的

这要问楼主
页: [1]
查看完整版本: 装饰器这个为啥报错了