装饰器-decorator

def memo
  cache = {}
  @wraps(func)
  def wrapper(*args):
      if args not in cache:
        cache[args] = func(*args)
      return cache[args]
  return wrapper
  1. 我们定义如下函数,将输入参数乘2并返回
def f(x):
'''
double input
'''
   return x * 2
>>> f(3), f('a')
>>> 9, 'aa'
  1. 如果我们要求输入参数x必须为int型,否则返回None,可以通过定义函数fn_int来实现
def fn_int(func):
    def wrapper(*args):
        for arg in args:
            if not isintance(arg, int):
                return 
       return func(*args)
    return wrapper
>>> g = fn_int(f)
>>> f(3), f('a')
6, 'aa'
>>> g(3), g('a')
6, None
  1. 可以通过添加装饰器符号@来将上面两步骤合并
@fn_int
def f(x):
'''
double input
'''
  return x * 2
>>> f(3), f('a')
6, None

但这时会有如下的问题

>>> f.__name__, f.__doc__
wrapper, None

而我们预期的结果是

f
double input
  1. 上面的问题可以由functools.wraps来解决
from functools import wraps
def fn_int(func):
    @wraps(func)  ### important line
    def wrapper(*args):
        for arg in args:
            if not isintance(arg, int):
                return 
       return func(*args)
    return wrapper
@fn_int
def f(x):
'''
double input
'''
   return x * 2
>>> f(3), f('a')
6, None
>>> f.__name__, f.__doc__
f
double input
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,248评论 19 139
  • 我对Python装饰器的理解就是用一个函数去修饰另外一个函数。 装饰器 在运行原来功能的基础上,添加一些新的功能...
    敢梦敢当阅读 273评论 0 1
  • 装饰是为函数和类指定管理代码的一种方式.装饰器本身的形式是处理其他的可调用对象的可调用的对象。 函数装饰器在函数定...
    低吟浅唱1990阅读 240评论 0 0
  • 弹剑莫嫌声奏苦,冯谖烧券义薛城。 吾今欲请春风顾,也备为君播远名。 注:海棠短线活动做。题:干谒诗,格律诗。
    庆善阅读 228评论 2 9
  • 错误简要信息 错误完整信息如下: 错误原因: 在使用Intellj Idea在当前项目中使用本地Apache cx...
    airkisser阅读 6,287评论 0 0