|
发表于 2023-7-28 16:50:34
|
显示全部楼层
本楼为最佳答案
 在这个代码中,出现 myfunc 类型为 NoneType 的问题是因为装饰器函数 time_master 没有正确返回内部函数 call_func 的引用。
让我们来分析代码的执行过程:
1. 定义了 time_master 装饰器函数,它接受一个 msg 参数,并返回一个内部函数 call_func 。
2. 在定义 myfunc 函数之前,使用 @time_master('你好') 语法将 myfunc 函数装饰了起来。这相当于执行了 myfunc = time_master('你好')(myfunc) ,即用 time_master('你好') 返回的函数对象来重新绑定 myfunc 变量。
3. call_func 内部函数在被调用时会执行传入的函数 func() ,在这里就是 myfunc() 。
4. myfunc 函数内部执行了 time.sleep(2) 来模拟耗时操作,然后打印一条消息。
然而, call_func 内部没有返回任何值,而是直接使用了 func() 执行了 myfunc() 函数。因为 myfunc 函数本身没有返回值,所以 call_func 内部的 return 语句实际上返回了默认值 None ,导致 myfunc 函数被装饰后,其类型变为 NoneType 。
为了解决这个问题,你需要在 call_func 内部添加一个返回语句,将 func() 的返回值传递给外部调用。修改代码如下:
- import time
- def time_master(msg):
- def call_func(func):
- print("开始运行程序...")
- start = time.time()
- result = func() # 调用func,并获取其返回值
- stop = time.time()
- print("结束程序运行...")
- print(f"[{msg}]一共耗费了{(stop - start):.2f}秒。")
- return result # 返回func的返回值
- return call_func
- @time_master('你好')
- def myfunc():
- time.sleep(2)
- print("I Love FichC ^o^")
- print(myfunc.__name__)
复制代码
现在, myfunc 应该会被正确地装饰,并且其类型不再是 NoneType ,而是一个函数类型。 |
|