Discuss / Python / 小结的作业-根据大佬启发写的。。。

小结的作业-根据大佬启发写的。。。

Topic source

不知小岛

#1 Created at ... [Delete] [Delete and Lock User]
def log(fn1):
    if isinstance(fn1,str): 
        def decorator(fn):
            @functools.wraps(fn)
            def wrapper(*args,**kw):
                print('%s %s():' % (fn1, fn.__name__))
                print('begin call %s' % fn.__name__)
                fn(*args,**kw)
                print('end call %s' % fn.__name__)
                return fn(*args,**kw)
            return wrapper
        return decorator
    else:
        @functools.wraps(fn1)
        def wrapper(*args,**kw):         
            print('begin call %s' % fn1.__name__)
            fn1(*args,**kw)
            print('end call %s' % fn1.__name__)
            return fn1(*args,**kw)
        return wrapper
#测试        
@log#now = log(now)
def now():
    print('2015-3-25')
now()

@log('excute')
def now2():
    print('2015-3-25')
now2()

活力老汤

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

重复调用两次now,改成下面貌似就可以了

                print('begin call %s' % fn.__name__)
                x=fn(*args,**kw)
                print('end call %s' % fn.__name__)
                return x
def log(fn1, *args):
	#如果是带参装饰器,则传入的fn1一定是装饰器括号内的参数,如字符串等,
	# 因此if下为两层函数,加上最外层的函数,与一般的带参装饰器的三层函数一样运行。
    if isinstance(fn1, str): 
        def decorator(fn):
            @functools.wraps(fn)
            def wrapper(*args,**kw):
                print('%s %s():' % (fn1, fn.__name__))
                fn(*args, **kw)
                print('end call %s' % fn.__name__)
            return wrapper
        return decorator
    #如果是不带参数的装饰器,那么最先被传入的fn1必定是函数,
    # 函数是不会被判断成字符串类型的,所以else下只有一层函数再加上最外层的函数,
    # 一共为两层函数,运行时与不带参的装饰器一样运行。
    else:
        @functools.wraps(fn1)
        def wrapper(*args,**kw):         
            print('begin call %s():' % fn1.__name__)
            fn1(*args,**kw)
            print('end call %s' % fn1.__name__)
        return wrapper
#测试        
@log
def now():
    print('2015-3-25')
now()

print()

@log('excute')
def now2():
    print('2015-3-25')
now2()

在你的代码基础上再结合大佬的注释改的哈 这样now函数不用输出两次

不知小岛

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

nice


  • 1

Reply