13432878738 发表于 2018-8-12 14:48:14

python学习9-装饰器和类型提升

  一装饰器
  参数是一个函数,返回值是一个函数,就可以作为装饰器.
  常见的使用场景:监控、日志、缓存、路由、权限、参数检查、审计
  1、类似如下:
  

import functools  
def fn1(fn):
  @functools.wraps(fn)
  def wrap(*arg,**kw):
  print('start')
  ret = fn(*arg,**kw)
  print('stop')
  return ret
  return wrap
  
@fn1
  
def fn2(x):
  print(x)
  

  2、带参数的装饰器类似如下:
  

def logger(s,p=lambda name,t:print('call {} took {}'.format(name,t))):  def _logger(fn):
  @functools.wraps(fn)
  def wrap(*arg,**kw):
  start = datetime.datetime.now()
  ret = fn(*arg,**kw)
  end = datetime.datetime.now()
  if (end - start).total_seconds() > s:
  p(fn.__name__,end-start)
  return ret
  return wrap
  return _logger
  

  
@logger(2)
  
def sleep(x):
  time.sleep(x)
  

  二、类型提升
  一个变量的类型,是在运行时决定的
  一个变量的类型在应用的生命周期中是可变的
  1、->int 只是注释,不检查,p3加入
  

def add(x,y)->int:  return x + y
  

  三、常用
  

import functools  
newadd = functools.partial(add,y=5) #设定函数默认值
  
@functools.lru_cache() #按参数缓存,默认为128条,按照最近最少使用替换,满足不需要过期、清除、分布式,无副作用即可使用
页: [1]
查看完整版本: python学习9-装饰器和类型提升