有时候把Python函数调用的命名参数都收集到一个dict中可以更方便地做参数检查,或者直接由参数创建attribute等。更简单的理解就是def foo(*args, **kwargs): pass可以接受所有的参数,其中kwargs就是命名参数字典,那么直接在函数外面套个foo却不能达到目的,一个比较简单的实现是这样的:

def annotation(**annotations):
"""
A decorator to collect all named args to function.__namedargs__,
all anonymous args to function.__unnamedargs__,
decorator's args to function.__annotations__.
""" def func_decorator(func):
@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 return func_decorator

annotation的的用法仿照Python 3的Function Annotation,可以对参数做标记等,这里所有的标记都会存放在function.__annotations__中:

如果只要annotation,那么可以这样做避免额外调用开销:

def annotation(**anno):
"""
A decorator to update decorator's args to function.__annotations__. """ def func_decorator(func):
"""
Static check annotation.
"""
argspec = inspect.getargspec(func)
callargs = set(argspec.args)
callargs.add(argspec.varargs)
callargs.add(argspec.keywords)
invalid_keys = anno.viewkeys() - callargs
if invalid_keys:
raise TypeError('Invalid annotation keys = %s' % (invalid_keys))
else:
func.__annotations__ = anno
return func return func_decorator

最新文章

  1. CSS清除浮动八种方法
  2. imshow() displays a white image for a grey image
  3. html 定位问题
  4. power
  5. java文件乱码
  6. gradle介绍
  7. EPANET中的哈希文件——hash.c
  8. Android优化—— 内存分析工具 MAT 的使用
  9. java日期类型转换总结date timestamp calendar string
  10. PHP 反射 ReflectionClass
  11. first blog编程之美-----计算1的个数
  12. Python之路第八天,基础(10)-异常处理
  13. struts2中配置文件的调用顺序
  14. jQuery中的$.getJSON、$.ajax、$.get、$.post的区别
  15. 容器化-Docker实战
  16. 开发板测试-Wi-Fi
  17. Java通过遍历sessionId获取服务器所有会话session
  18. nginx安装扩展 sub_filter&http_ssl_module
  19. eclipse编译项目:Java @Override 注解报错的解决方法
  20. 《集体智慧编程》第7章代码 Python3执行出错

热门文章

  1. Static Constructors
  2. 6.3 Android Framework
  3. RabbitMq基本使用
  4. Dynamic CRM 2013学习笔记(二十四)页面保存前进行逻辑验证
  5. 【Win10】UAP/UWP/通用 开发之 SplitView
  6. C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)
  7. 淘宝TFS分布式文件系统内部实现
  8. 自己动手写客户端UI库——事件机制(设计思路大放送)
  9. 语音直播是否真能让国内网红向“Creator”转变?
  10. O2O已死?不!美团点评们迎来新风口