鱼C论坛

 找回密码
 立即注册
查看: 2736|回复: 6

[已解决]关于修饰的应用

[复制链接]
发表于 2020-3-17 21:46:25 | 显示全部楼层 |阅读模式
5鱼币
大佬们,我将小甲鱼的相关@修饰代码按照自己的理解改了一下,可是不知道哪里除了出了问题,大佬们帮忙看一下
import time

import time


def call(func):
    start = time.clock()
    print("It's time starting ! ")
    func()
    print("It's time ending ! ")
    end = time.clock()
    return "It's used : %s ." % (end - start)


@call
def f():
    y = 0
    for i in range(10):
        y = y + i + 1
        print(y)
   

print(f())
最佳答案
2020-3-17 21:46:26
  1. import time

  2. def timeit(function):
  3.     def wrapper():
  4.         start = time.clock()
  5.         print("It's time starting!")
  6.         function()
  7.         print("It's time ending!")
  8.         end = time.clock()
  9.         print(f'函数执行所花费的时间为:{end-start}')
  10.     return wrapper

  11. @timeit
  12. def f():
  13.     y = 0
  14.     for i in range(10):
  15.         y = y + i + 1
  16.         print(y)
  17.    

  18. f()
复制代码

修改成这样,修饰器必须要返回一个可callable对象,不然就会报错,楼上有报错原因。

报错

报错

最佳答案

查看完整内容

修改成这样,修饰器必须要返回一个可callable对象,不然就会报错,楼上有报错原因。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 21:46:26 | 显示全部楼层    本楼为最佳答案   
  1. import time

  2. def timeit(function):
  3.     def wrapper():
  4.         start = time.clock()
  5.         print("It's time starting!")
  6.         function()
  7.         print("It's time ending!")
  8.         end = time.clock()
  9.         print(f'函数执行所花费的时间为:{end-start}')
  10.     return wrapper

  11. @timeit
  12. def f():
  13.     y = 0
  14.     for i in range(10):
  15.         y = y + i + 1
  16.         print(y)
  17.    

  18. f()
复制代码

修改成这样,修饰器必须要返回一个可callable对象,不然就会报错,楼上有报错原因。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 03:52:19 | 显示全部楼层
return "It's used : %s ." % (end - start)    返回被接受后  运行,所以报错
就是
a = "It's used : %s ." % (end - start)
a()  引发的异常
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 07:31:10 | 显示全部楼层
怎么有两个%
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 07:54:41 | 显示全部楼层
@call
def f():
等价于 f = call(f)
运行时call(f)返回的是“It's used:  时间”,是一个字符串,也就是说f这个指向了一个字符串,
下面的f()是调用函数,而字符串不能调用,所以报错。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 13:13:29 | 显示全部楼层
@call 之后 f 就变成了 "It's used : %s ." % (end - start)

修饰器应该这么写:
  1. def call(func):
  2.     def wrapper():
  3.         start = time.clock()
  4.         print("It's time starting ! ")
  5.         func()
  6.         print("It's time ending ! ")
  7.         end = time.clock()
  8.         return "It's used : %s ." % (end - start)
  9.     wrapper.__name__=func.__name__
  10.     return wrapper
复制代码


ps:都2020年了,用str.format和f-string来格式化字符串吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-19 11:24:04 | 显示全部楼层
iltifa 发表于 2020-3-17 21:46
修改成这样,修饰器必须要返回一个可callable对象,不然就会报错,楼上有报错原因。

谢谢大佬,我也是一直没有深入了解修饰语句的使用。原来在修饰之后,会默认的加上()来实现调用,所以,在那个里面必须再套一个函数啊。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 06:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表