Discuss / Python / 交作业:2,3题

交作业:2,3题

Topic source

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

3.既能@log也能@log('text')

import functools,time
def log(k):
    if isinstance(k,str):#主要就是这一句,判断输入的参数类型。
        def log2(fn):
            @functools.wraps(fn)
            def wrapper(*args, **kw):
                print('call:%s' % fn.__name__ + '   ' + k)
                return fn(*args, **kw)
            return wrapper
        return log2
    else:
        @functools.wraps(k)
        def wrapper(*args, **kw):
            print('call:%s' % k.__name__)
            return k(*args, **kw)
        return wrapper

black_cccc

#2 Created at ... [Delete] [Delete and Lock User]

???

GERAMA7766

#3 Created at ... [Delete] [Delete and Lock User]

python 小白求教 代码输进去怎么不显示结果呢?我用的sublime 不显示运行时间

kingk123456

#4 Created at ... [Delete] [Delete and Lock User]

请问一下 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(。。)不行,然后借鉴的楼主的,希望楼主解答一下

drewsir

#7 Created at ... [Delete] [Delete and Lock User]

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

Reply