Discuss / Python / 不必把问题复杂化

不必把问题复杂化

Topic source
#练习
import time,functools
def metric(fn):
    @functools.wraps(fn)
    def wrapper(*args,**kw):
        start=time.time()
        fn(*args,**kw)
        end=time.time()
        print('%s execute in %s ms' %(fn.__name__,end-start))
        return fn(*args,**kw)
    return wrapper

@metric
def fast(x,y):
    time.sleep(0.0012)
    return x+y

f=fast(11,22)
print(f)

#思考一:
import functools

def log(func):
    @functools.wraps(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('2018-10-4')

now()
print (now.__name__)

#思考二
import functools

def log(*nub): #可变参数即可满足
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args,**kw):
            print(nub)
            print('%s %s()' % (nub,func.__name__))        
            func(*args,**kw)
            print('end %s()'% func.__name__)
        return wrapper
    return decorator

@log('execute') 
def now():
print('2018-10-4')

now()
print (now.__name__)

在练习的

def wrapper(*args,**kw): start=time.time() fn(*args,**kw) end=time.time() print('%s execute in %s ms' %(fn.name,end-start)) return fn(*args,**kw)

中,发现 fn(*args, **kw) 使用了两次,一次用于时间计算,另一次用于函数本身的运行。

请问这两次不能简化为一次吗?

另外求个QQ或者QQ群,其他的回复乱七八糟的不知道是什么鬼。。。

在思考一中,你将 return func(*args, **kw) 置换成了 func(*args, **kw),这是否有错误?

因为 now 函数的输出是 print , return xxx 和 return print(xxx) 的结果均能看到...

思考3是错的。。

泛色海岸

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

我感觉 这里不能用可变参数吧。。。

思考2 是错的, 当我修饰器不带参数时会出错,


  • 1

Reply