Discuss / Python / 第二题想的脑袋疼。。。

第二题想的脑袋疼。。。

Topic source

LeborYi

#1 Created at ... [Delete] [Delete and Lock User]
#1. 装饰器本身不用传入参数,只接收函数func

def log(func):
    def wrapper(*args, **kw):
        print('begin call %s():' % func.__name__)
        func(*args, **kw)
        print('end call %s():' % func.__name__)
    return wrapper

@log
def now():
    print('2017-4-25')
#2. 装饰器本身需要传入参数,再接收函数func 
import functools

def log(str):
    def decorater(func):
        @functools.wraps(func)
        def wrapper(*args,**kwargs):
                print('text = %s,begin call:%s' % (str,func.__name__))
                func(*args,**kwargs)
                print('text = %s,end call:%s' % (str,func.__name__))
        return wrapper
    return decorater

@log('execute')
def now():
    print('2017-5-11')

先奉上答案,慢慢思考如何实现两者共存

LeborYi

#2 Created at ... [Delete] [Delete and Lock User]
#两者共存,腿子的方法:或可用默认参数text=''或者可变参数*args
import functools


def log(str=''):
    def decorater(func):
        @functools.wraps(func)
        def wrapper(*args,**kwargs):
                if str != '':
                    print('text = %s,begin call = %s' % (str,func.__name__))
                    func(*args,**kwargs)
                    print('text = %s,end call = %s' % (str,func.__name__))
                else:
                    print('begin call = %s' % (func.__name__))
                    func(*args,**kwargs)
                    print('end call = %s' % (func.__name__))
        return wrapper
    return decorater



#总觉的if else这一块的代码块可以简化,但是...饿了啊啊
#*args的方法还不会使用,*args是tuple,而传入的是str
>>> @log('today')
def now():
    print('2017-5-11')

>>> now()
text = today,begin call = now
2017-5-11
text = today,end call = now
>>> @log()
def now():
    print('2017-5-11')

>>> now()
begin call = now
2017-5-11
end call = now

不寒杨柳

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

这种方法并不支持不带参数的装饰器, 在测试时,如果使用@log, 会报TypeError: decorator() missing 1 required positional argument: 'func'的错, @log()不会报错,但是这种形式已经是带参数的装饰器了。 个人理解,欢迎指正批评。

正确的解答还是楼下的。

同意@不寒杨柳

javaape

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

个人见解

在此插入代码

import functools

def log(text): def decorator(func): @functools.wraps(func) def wrapper(args, kw): if len(text) > 0: print('begin call %s %s():' % (text[0], func.name)) else: print('begin call %s():' % func.name) result = func(*args, kw) if len(text) > 0: print('end call %s %s():' % (text[0], func.name)) else: print('end call %s():' % func.name) return result

    return wrapper

return decorator

  • 1

Reply