写带参数的函数装饰器最纠结的是需要包好多层,最外层是接收参数的函数,它返回一个接收函数的的函数。但这样有个问题是,最终包装出来的装饰器必须加()调用一下,即使没有参数也需要这样做,因为调用这个最外层函数才能返回里面装饰器(就是接收函数的函数)。以前一篇为例,可以这样改进:

def opt_arguments(func):
def meta_wrapper(*args, **kwargs):
if len(args) == 1 and callable(args[0]):
return func(args[0])
else:
def meta_func(inner_func):
return func(inner_func, *args, **kwargs)
return meta_func
return meta_wrapper @opt_arguments
def annotation(func, **annotations):
"""
A decorator to collect all named args to function.__namedargs__,
all anonymous args to function.__unnamedargs__,
decorator's args to function.__annotations__.
""" @functools.wraps(func)
def func_wrapper(*args, **kwargs):
argspec = inspect.getargspec(func)
namedargs = inspect.getcallargs(func, *args, **kwargs) # def foo(a, b=0, *c, **d): pass
# foo(1, b=2, c=3, d=4) will convert c=3 to namedargs.
unnamedargs = namedargs.pop(argspec.varargs, ())
namedargs.update(namedargs.pop(argspec.keywords, {})) func_wrapper.__namedargs__ = namedargs
func_wrapper.__unnamedargs__ = unnamedargs
func_wrapper.__annotations__ = annotations
func(*args, **kwargs) return func_wrapper

这样得到的annotation可以无参数使用:

最新文章

  1. 使用Cocos2d-x实现微信“天天爱消除”炫耀button特效
  2. yii2知识点详解
  3. C++ 基本知识
  4. iOS 手势操作:拖动、捏合、旋转、点按、长按、轻扫、自定义
  5. Arch yaourt 安装
  6. 学习使用Markdown标记语言
  7. poj Organize Your Train part II
  8. python成长之路13
  9. [置顶] EasyMock的简单使用
  10. asp.net -mvc框架复习(1)-ASP.NET网站开发概述
  11. python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法
  12. java基础(四):谈谈java中的IO流
  13. Android-TextView 控件常用属性以及基本用法
  14. MongoDB AUTH结果验证
  15. 用Emacs的这些年
  16. 如何获取JMX监控WebSphere所需的com.ibm.ws.admin.client_8.5.0等jar包
  17. CAS多点登录
  18. rsync 数据备份+cron+mailx案例
  19. Android 开发工具类 29_sendPOSTRequest
  20. Integer和new Integer

热门文章

  1. bzoj 1064
  2. 用c#开发微信(3)基于Senparc.Weixin框架的接收普通消息处理 (源码下载)
  3. Dynamic CRM 2013学习笔记(四十二)流程5 - 实时/同步工作流(Workflow)用法图解
  4. WPF快速入门系列(2)——深入解析依赖属性
  5. 帅呆了!ASP.NET Core每秒能处理115万个请求
  6. 读《你必须知道的.NET》继承本质论 Bird bird=new Chicken()
  7. [外挂8] 自动挂机 SetTimer函数
  8. Beta分布和Dirichlet分布
  9. 1120练习,CSS制作网页
  10. [Java拾遗一] XML的书写规范与解析.