博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python: 拷贝函数签名
阅读量:6263 次
发布时间:2019-06-22

本文共 1301 字,大约阅读时间需要 4 分钟。

使用场景有很多,比如C API在Python下很多都变成了(*args, **kwargs)的参数,这时候可能需要为其添加一个更严格签名来约束参数。

查了许多资料,能有效的拷贝函数签名貌似只能通过动态创建具有新签名的包装函数。使用这一技术的典型范例就是decorator库:

下面就根据decorator来实现一个拷贝函数签名的decorator:

from decorator import FunctionMaker, decoratorfrom contextlib import contextmanager @contextmanagerdef rename_scope(obj, new_name):	""" A rename scope to rename obj's __name__, restore __name__when exit. """    old_name = obj.__name__    obj.__name__ = new_name    yield    obj.__name__ = old_name def newcaller(caller, sig_func):	""" Generate a new caller using sig_func signatures, doc and name, etc. """    evaldict = sig_func.func_globals.copy()    evaldict['_call_'] = caller    return FunctionMaker.create(        sig_func, "return _call_(%(shortsignature)s)",        evaldict, signature=sig_func)  def signature(sig_func, copy_name=False):	""" A decorator to update function signature, doc by sig_func. If copy_name, the return function use sig_func name else function keep its name. """    def sig_wrapper(caller):        with rename_scope(sig_func, sig_func.__name__ if copy_name else caller.__name__):            return newcaller(caller, sig_func)    return sig_wrapper

用起来大概是这一个样子:

  • 首先,函数签名肯定是变了,在IPython下立马能看到函数提示变化:

image

  • 其次,是函数调用参数符合签名时,正常使用:

image

  • 最后,是函数调用参数不符合签名时,会报详细错误:

image

目前实现的signature能够控制是否拷贝签名函数的函数名,对于doc也可以实现类似的可控制的参数。

转载地址:http://rezpa.baihongyu.com/

你可能感兴趣的文章
动画view
查看>>
自己写个多任务多线程断点下载框架
查看>>
Css 按钮
查看>>
Silverlight显示WCF详细异常信息
查看>>
BZOJ5299:[CQOI2018]解锁屏幕(状压DP)
查看>>
BZOJ1042:[HAOI2008]硬币购物(DP,容斥)
查看>>
[项目管理]关于项目的工期控制
查看>>
hdu3976(Electric resistance) 高斯消元
查看>>
重启eclipse color theme失效的解决办法
查看>>
使用腾讯云COS与CDN提示跨域的解决方案
查看>>
openwrt的自动挂载功能
查看>>
C# 委托链、多路广播委托
查看>>
使用ADO.NET DbContext Generator出现错误—Unable to locate file
查看>>
以下是大数人K站的原因,N个站的总结经验。
查看>>
《失业的程序员》(八):创业的要素
查看>>
ASP.net 连接 Lotus Domino ,在VS中可以正常,放到IIS中不能正常运行。
查看>>
Hibernate总结--MyEclipse的小bug
查看>>
PHP 附近的人
查看>>
浏览器渲染引擎
查看>>
const在C++中的一些应用
查看>>