交作业:2,3题
Topic source请问一下 import time,functools def log(fn): @functools.wraps(fn) def wrapper(args,**kw): print('begin call') c=fn(args,**kw) print('end call') return c return wrapper 我在交互环境里测试时 为什么输入return c 会出现invalid syntax?
2.在调用前后打印日志
import time,functools def log(fn): @functools.wraps(fn) def wrapper(args,**kw): print('begin call') c=fn(args,**kw) print('end call') return c return wrapper
这个输出不对啊,输出的是 begin call end call xxxxxx
题目要求应该是 begin call xxxxx end call
想了半天没有实现,有没有哪个大神指点下的
import functools
def log(text = "end"): def decorate(func): @functools.wraps(func) def wrapper(arg, **lw): c = func(arg, **lw) print("%s call" % text) return c print("begin call") return wrapper return decorate
@log() def now(): print("2018")
now() 这样就能实现题目要求了,但是我借鉴了楼主的c = func(arg,*lw),print(。。。),returnc,但是我不理解为什么把func函数赋值给一个变量c后再返回变量c就能实现题目要求了,我之前是直接print(。。。)然后return func(。。)不行,然后借鉴的楼主的,希望楼主解答一下
import functools
def log(fn): @functools.wraps(fn) def wrapper(args, **kw): print('begin call') fn(args, **kw) print('end call') return wrapper
@log # now = log(now)
def now(): print('2018-3-1')
now()
回复楼上的一些疑问。 代码测试过了,是可以运行的哈。
有人问: 但是我不理解为什么把func函数赋值给一个变量c后再返回变量c就能实现题目要求了,我之前是直接print(。。。)然后return func(。。)不行,然后借鉴的楼主的,希望楼主解答一下
针对第二题: 为什么要把func赋值给一个变量c?
c=fn(args,**kw)
其实这并不是把函数赋给变量c,而是把函数的返回值赋给变量c。 上面这一行代码的运行顺序是,先执行函数fn,然后返回值,把返回值赋给c。 为什么要有这一行是因为我们的装饰器不能破坏原来的函数,原来的函数有返回值,我们装饰之后也必须要返回值。但是有个问题,一旦返回值函数运行就会终止,所以我们用c拿到返回值,在函数执行完后再返回c。这样既不破坏原函数,又能在函数运行结束后打印时间。
- 1
MRZ轲信御马上
2.在调用前后打印日志
3.既能
@log
也能@log('text')