鱼C论坛

 找回密码
 立即注册
查看: 1937|回复: 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
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对象,不然就会报错,楼上有报错原因。

报错

报错

最佳答案

查看完整内容

修改成这样,修饰器必须要返回一个可callable对象,不然就会报错,楼上有报错原因。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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对象,不然就会报错,楼上有报错原因。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 03:52:19 | 显示全部楼层
return "It's used : %s ." % (end - start)    返回被接受后  运行,所以报错
就是
a = "It's used : %s ." % (end - start)
a()  引发的异常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 07:31:10 | 显示全部楼层
怎么有两个%
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

修饰器应该这么写:
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来格式化字符串吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

谢谢大佬,我也是一直没有深入了解修饰语句的使用。原来在修饰之后,会默认的加上()来实现调用,所以,在那个里面必须再套一个函数啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 01:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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