Python functools其他都比较简单,挑partial和wraps扯扯淡

1.functools.partial

官网文档说的真是不好理解,就当作是把一个函数,绑定部分或者全部参数后生成一个新版本的函数.

还是很绕口,看例子

from functools import partial
>>> def add(a, b, kw="add"):
...     return a+b, kw
...
>>> add
<function add at 0x2afeaf7cecf8>>>> plus3 = partial(add, 3, kw="add_3")
>>> plus3.func
<function add at 0x2afeaf7cecf8>
>>> plus3.args
(3,)
>>> plus3.keywords
{'kw': 'add_3'}
>>> plus3(5)
(8, 'add_3')

plus3就是创建一个新函数(准确的说,是叫partial object,不用管,你就当函数,不影响使用):args使用你预置的3, kwargs也update你指定的关键字参数,被修改的args和kwargs最终都被应用到add函数上

2.functools.wraps

文档说的比较详细,如果不使用这个wraps,那么原始函数的__name____doc__都会丢失

不使用wraps例子

>>> def my_decorator(f):
...     def wrap(*args, **kwargs):
...         print "decorated func called"
...         return f(*args, **kwargs)
...     return wrap
...
>>>
>>> @my_decorator
... def ff():
...     """ff doc str"""
...     print "ff called"
...
>>>
>>> ff>>> ff.__doc__
>>> ff.__name__
'wrap'
>>> ff()
decorated func called
ff called

可以看到ff.__doc__丢失,ff.__name__被覆盖。下面是使用wraps例子

>>> from functools import wraps
>>> def my_decorator2(f):
...     @wraps(f)
...     def wrap(*args, **kwargs):
...         print "decorated func called"
...         return f(*args, **kwargs)
...     return wrap
...
>>> @my_decorator2
... def gg():
...     """gg doc str"""
...     print "gg called"
...
>>> gg.__doc__
'gg doc str'
>>> gg.__name__
'gg'
>>> gg()
decorated func called
gg called

gg.__doc__和gg.__name__被保留。所以呢,为了便于调试,尽量保留原始函数信息,日志里才能更清楚的输出各种信息

Python functools详解相关推荐

  1. python区块链开发_Fabric区块链Python开发详解

    Hyperledger Fabric是最流行的联盟区块链平台.Fabric区块链Python开发详解课程 涵盖Fabric区块链的核心概念.Fabric网络搭建.Node链码开发.Python应用开发 ...

  2. python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

  3. 【python】详解类class的继承、__init__初始化、super方法

    原文链接; https://blog.csdn.net/brucewong0516/article/details/79121179?utm_medium=distribute.pc_relevant ...

  4. python与golang_Golang与python线程详解及简单实例

    Golang与python线程详解及简单实例 在GO中,开启15个线程,每个线程把全局变量遍历增加100000次,因此预测结果是 15*100000=1500000. var sum int var ...

  5. python 最小二乘法_最小二乘法及其python实现详解

    最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出).它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可以简便地求得 ...

  6. 【python】详解multiprocessing多进程-Pool进程池模块(二)

    [python]详解multiprocessing多进程-process模块(一) [python]详解multiprocessing多进程-Pool进程池模块(二) [python]详解multip ...

  7. 【python】什么是序列,Python序列详解

    什么是序列,Python序列详解 概述 序列索引 序列切片 序列相加 序列相乘 检查元素是否包含在序列中 序列相关的内置函数 range 快速初始化数字列表 概述 所谓序列,指的是一块可存放多个值的连 ...

  8. python多线程详解 Python 垃圾回收机制

    文章目录 python多线程详解 一.线程介绍 什么是线程 为什么要使用多线程 总结起来,使用多线程编程具有如下几个优点: 二.线程实现 自定义线程 守护线程 主线程等待子线程结束 多线程共享全局变量 ...

  9. Python线程详解

    Python线程详解 线程简介 开启多线程 线程之间共享 GIL全局解释器锁 线程间通信 线程简介 线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元. ...

最新文章

  1. yolov5改进mark
  2. 自然水体辐射特性与数值模拟 pdf_【技术·航天】定量评估贡献 精准决策未来 ——气象卫星数据在数值预报系统中贡献的定量评估...
  3. Java 里的泛型简介.
  4. rxjs里scan operators的用法
  5. 【theano-windows】学习笔记九——softmax手写数字分类
  6. 大专计算机应用基础课件,11春大专《计算机应用基础》练习课件.doc
  7. 2020 年百度之星·程序设计大赛 - 复赛 1001Battle for Wosneth
  8. hdu 4315 Climbing the Hill 博弈问题,可转化为nim游戏问题,多校联合赛(二)第六题
  9. 高分1、2号卫星原始遥感影像数据
  10. vue动态绑定背景图片的透明度
  11. 「第五章」点击劫持(ClickJacking)
  12. android 删除短信无效,android删除短信(绕过权限)
  13. 贴片电解电容47UF16V 6.3*4.5
  14. MTK 安卓11 传感器兼容 陀螺仪42607-p
  15. 国内CRM系统哪家好 CRM管理系统推荐
  16. 完美解决丨1. **`SyntaxError: invalid syntax`**
  17. caffe/ windows 10 /Can't parse message of type caffe.NetParameter because it is missing required
  18. B2B策划书:在线B2B行业小额批发平台
  19. 阿里云OSS文件批量打包下载
  20. linux pppoe拨号上网

热门文章

  1. 用户手册:与 deviceShifu 交互的应用
  2. 代码实现3X3矩阵求逆(C语言 用伴随矩阵实现)
  3. 华为盒子总显示连接不到服务器,华为盒子 连接服务器地址
  4. C# 控制台程序 隐藏控制台窗口
  5. 游戏交流社区BBS论坛APP客户端和网页服务端设计 毕业论文+前后端源码及数据库文件
  6. VIVO语音翻译这么好用,知道的为什么会这么少?别说我没告诉过你
  7. 微信小程序如何把图片上传至服务器
  8. unittest框架--verbosity详解
  9. Javisoj_level6_x64_writeup
  10. Redis Cluster Sentinel