Python进阶(八)-编写带参数decorator
来源:互联网 发布:微软sql 编辑:程序博客网 时间:2024/05/18 03:08
Python进阶(八)-编写带参数decorator
继续考察@log 装饰器:
def log(f): def fn(x): print 'call ' + f.__name__ + '()...' return f(x) return fn
发现对于被装饰的函数,log打印的语句是不能变的(除了函数名)。
如果有的函数非常重要,希望打印出’[INFO] call xxx()…’,有的函数不太重要,希望打印出’[DEBUG] call xxx()…’,这时,log函数本身就需要传入’INFO’或’DEBUG’这样的参数,类似这样:
@log('DEBUG')def my_func(): pass
把上面的定义翻译成高阶函数的调用,就是:
my_func = log('DEBUG')(my_func)
上面的语句看上去还是比较绕,再展开一下:
log_decorator = log('DEBUG')my_func = log_decorator(my_func)
上面的语句又相当于:
log_decorator = log('DEBUG')@log_decoratordef my_func(): pass
所以,带参数的log函数首先返回一个decorator函数,再让这个decorator函数接收my_func并返回新函数:
def log(prefix): def log_decorator(f): def wrapper(*args, **kw): print '[%s] %s()...' % (prefix, f.__name__) return f(*args, **kw) return wrapper return log_decorator@log('DEBUG')def test(): passprint test()
执行结果:
[DEBUG] test()…
None
对于这种3层嵌套的decorator定义,你可以先把它拆开:
# 标准decorator:def log_decorator(f): def wrapper(*args, **kw): print '[%s] %s()...' % (prefix, f.__name__) return f(*args, **kw) return wrapperreturn log_decorator# 返回decorator:def log(prefix): return log_decorator(f)
拆开以后会发现,调用会失败,因为在3层嵌套的decorator定义中,最内层的wrapper引用了最外层的参数prefix,所以,把一个闭包拆成普通的函数调用会比较困难。不支持闭包的编程语言要实现同样的功能就需要更多的代码。
举例
在@performance实现打印秒的同时,请给 @performace 增加一个参数,允许传入’s’或’ms’:
@performance('ms')def factorial(n): return reduce(lambda x,y: x*y, range(1, n+1))
要实现带参数的@performance,就需要实现:
my_func = performance('ms')(my_func)
需要3层嵌套的decorator来实现。
参考代码:
import timedef performance(unit): def perf_decorator(f): def wrapper(*args, **kw): t1 = time.time() r = f(*args, **kw) t2 = time.time() t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1) print 'call %s() in %f %s' % (f.__name__, t, unit) return r return wrapper return perf_decorator@performance('ms')def factorial(n): return reduce(lambda x,y: x*y, range(1, n+1))print factorial(10)
2 0
- Python进阶(八)-编写带参数decorator
- Python编写带参数decorator
- Python进阶(六)-python编写无参数decorator
- Python中带参数的decorator
- python中编写无参数decorator
- 编写带命令行参数的 Python 程序
- Python进阶之装饰器@decorator
- python进阶——装饰器Decorator
- python进阶7:decorator装饰器
- 内核模块编程之进阶(四)-编写带参数的中断模块
- 内核模块编程之进阶(三)-编写带参数的中断模块
- 内核模块编程之进阶(四)-编写带参数的中断模块
- Python Decorators(二):Decorator参数
- Python Decorators(二):Decorator参数【转载】
- [Python入门及进阶笔记]Python-decorator装饰器小结
- [Python入门及进阶笔记]Python-decorator装饰器小结
- [Python入门及进阶笔记]Python-decorator装饰器小结
- 从坷里化理解Py带参数的decorator
- 你们知道工控资料窝吗
- 软件版本-管理-知识
- Hessian实例
- 【DragonBoard】刷Debian系统
- 剑指offer:合并两个排序的链表
- Python进阶(八)-编写带参数decorator
- 一直在路上
- 蓝桥杯——芯片测试
- 2017最新Windows环境下IOS APP上架流程(详细图文)
- nodejs express创建项目
- leetcode237 Delete Node in a LinkedList java
- 使用moy快速开发后台管理系统(四)
- Android 炫酷插件
- MSSQL存储过程中执行动态Sql语句