Python: 无参数的函数装饰器
2024-10-16 08:30:46
写带参数的函数装饰器最纠结的是需要包好多层,最外层是接收参数的函数,它返回一个接收函数的的函数。但这样有个问题是,最终包装出来的装饰器必须加()调用一下,即使没有参数也需要这样做,因为调用这个最外层函数才能返回里面装饰器(就是接收函数的函数)。以前一篇为例,可以这样改进:
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可以无参数使用:
最新文章
- 使用Cocos2d-x实现微信“天天爱消除”炫耀button特效
- yii2知识点详解
- C++ 基本知识
- iOS 手势操作:拖动、捏合、旋转、点按、长按、轻扫、自定义
- Arch yaourt 安装
- 学习使用Markdown标记语言
- poj Organize Your Train part II
- python成长之路13
- [置顶] EasyMock的简单使用
- asp.net -mvc框架复习(1)-ASP.NET网站开发概述
- python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法
- java基础(四):谈谈java中的IO流
- Android-TextView 控件常用属性以及基本用法
- MongoDB AUTH结果验证
- 用Emacs的这些年
- 如何获取JMX监控WebSphere所需的com.ibm.ws.admin.client_8.5.0等jar包
- CAS多点登录
- rsync 数据备份+cron+mailx案例
- Android 开发工具类 29_sendPOSTRequest
- Integer和new Integer
热门文章
- bzoj 1064
- 用c#开发微信(3)基于Senparc.Weixin框架的接收普通消息处理 (源码下载)
- Dynamic CRM 2013学习笔记(四十二)流程5 - 实时/同步工作流(Workflow)用法图解
- WPF快速入门系列(2)——深入解析依赖属性
- 帅呆了!ASP.NET Core每秒能处理115万个请求
- 读《你必须知道的.NET》继承本质论 Bird bird=new Chicken()
- [外挂8] 自动挂机 SetTimer函数
- Beta分布和Dirichlet分布
- 1120练习,CSS制作网页
- [Java拾遗一] XML的书写规范与解析.