python 装饰器最佳实践

作者: 彩色系 | 来源:发表于2017-10-08 15:49 被阅读116次

www.yunxcloud.cn

首先要明白装饰器是用来给函数增加额外功能的。

常用的工具函数

import time
from functools import wraps
import inspect
import sys
import logging

def timeit(func):
"""统计函数运行时间"""
t0 = time.perf_counter()
func()
return time.perf_counter() - t0

def count(func):
"""统计递归函数执行次数"""
# @wraps(func)
def counted(args):
counted.call_count += 1
return func(
args)
counted.call_count = 0
return counted

def memorize(f):
"""缓存"""
cache = {}
@wraps(f)
def memorized(args):
if args not in cache:
cache[args] = f(
args)
return cache[args]
return memorized

def trace(func):
"""跟踪函数,便于查看过程。"""
def afunc(args):
print("call", func.name, "with", args)
v = func(
args)
print(func.name, "return ",v)
return v
return afunc

def main(fn):
"""@main ---> name == "main" """
if inspect.stack()[1][0].f_locals['name'] == 'main':
args = sys.argv[1:] # Discard the script name from command line
fn(*args) # Call the main function
return fn

带参数的装饰器

def logged(level, name=None, message=None):
def decorate(func):
logname = name if name else func.module
log = logging.getLogger(logname)
@wraps(func)
def wrapper(*args, *kwargs):
logmsg = "{}--call --{}".format(func.name, args)
log.log(level, logmsg)
return func(
args, **kwargs)
return wrapper
return decorate

统计调用次数 增加缓存 增加debug 功能。

@logged(logging.DEBUG)
@count
@memorize
def fib(x):
return x if x < 2 else fib(x-1) + fib(x-2)

print(fib(10), fib.dict)

非常好的实现

flask 和 bottle 中的路由绑定

将add_url_rule 进行了一层包装,能够很简洁的使用装饰器的语法来绑定路由

def route(self, rule, **options):
def decorator(f):
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator

@route('/')
def example():
pass

flask login 中的判断是否登录了。。

要注意的地方。 装饰器本质上是一个高阶的函数,用来将函数包裹起来。

注意装饰器使用的顺序。

还有就是使用了装饰器的话原函数的一些信息可能会丢掉。需要通过一个方法

来将原函数的一些东西来绑定到新的上面。

博客 https://www.97up.cn/

更多例子

https://wiki.python.org/moin/PythonDecoratorLibrary

相关文章

  • python 装饰器最佳实践

    www.yunxcloud.cn 首先要明白装饰器是用来给函数增加额外功能的。 常用的工具函数 import ti...

  • Python 装饰器最佳实践

    Python 的 Decorator在使用上和Java/C#的Annotation很相似,就是在方法名前面加一个@...

  • 9个Python 内置装饰器: 显著优化代码

    装饰器是应用“Python 之禅”哲学的最佳 Python 特性。装饰器可以帮助您编写更少、更简单的代码来实现复杂...

  • 【Python实践】_装饰器

    真正的稳定,是自己不断成长,不断寻找新的空间。与其要稳定,不如开始拥抱这个变化的时代,让自己准备好。python实...

  • Python最佳实践指南

    Python最佳实践指南 Python版本的选择,最好是3. Python解释器,最好用cpython,其他需求可...

  • 装饰器模式

    介绍 在python装饰器学习 这篇文章中,介绍了python 中的装饰器,python内置了对装饰器的支持。面向...

  • python中的装饰器

    python装饰器详解 Python装饰器学习(九步入门) 装饰器(decorator) 就是一个包装机(wrap...

  • [译] Python装饰器Part II:装饰器参数

    这是Python装饰器讲解的第二部分,上一篇:Python装饰器Part I:装饰器简介 回顾:不带参数的装饰器 ...

  • Python中的装饰器

    Python中的装饰器 不带参数的装饰器 带参数的装饰器 类装饰器 functools.wraps 使用装饰器极大...

  • Python进阶——面向对象

    1. Python中的@property   @property是python自带的装饰器,装饰器(decorat...

网友评论

    本文标题:python 装饰器最佳实践

    本文链接:https://www.haomeiwen.com/subject/ieaeyxtx.html