bananatree 发表于 2020-3-17 21:46:25

关于修饰的应用

大佬们,我将小甲鱼的相关@修饰代码按照自己的理解改了一下,可是不知道哪里除了出了问题,大佬们帮忙看一下
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())

iltifa 发表于 2020-3-17 21:46:26

import time

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

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

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

Stubborn 发表于 2020-3-18 03:52:19

return "It's used : %s ." % (end - start)    返回被接受后运行,所以报错
就是
a = "It's used : %s ." % (end - start)
a()引发的异常

wangka 发表于 2020-3-18 07:31:10

怎么有两个%

iltifa 发表于 2020-3-18 07:54:41

@call
def f():
等价于 f = call(f)
运行时call(f)返回的是“It's used:时间”,是一个字符串,也就是说f这个指向了一个字符串,
下面的f()是调用函数,而字符串不能调用,所以报错。

永恒的蓝色梦想 发表于 2020-3-18 13:13:29

@call 之后 f 就变成了 "It's used : %s ." % (end - start){:10_248:}

修饰器应该这么写:def call(func):
    def wrapper():
      start = time.clock()
      print("It's time starting ! ")
      func()
      print("It's time ending ! ")
      end = time.clock()
      return "It's used : %s ." % (end - start)
    wrapper.__name__=func.__name__
    return wrapper

ps:都2020年了,用str.format和f-string来格式化字符串吧

bananatree 发表于 2020-3-19 11:24:04

iltifa 发表于 2020-3-17 21:46
修改成这样,修饰器必须要返回一个可callable对象,不然就会报错,楼上有报错原因。

谢谢大佬,我也是一直没有深入了解修饰语句的使用。原来在修饰之后,会默认的加上()来实现调用,所以,在那个里面必须再套一个函数啊。
页: [1]
查看完整版本: 关于修饰的应用