广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python的functools模块
  • 856
分享到

Python的functools模块

模块Pythonfunctools 2023-01-31 02:01:27 856人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

(wrapperwrappedassigned = WRAPPER_ASSIGNMENTSupdated = WRAPPER_UPDATES):  类似咱们自己写的copy_preperties功能;  wrapper包装函数, wrapp

(wrapperwrappedassigned = WRAPPER_ASSIGNMENTSupdated = WRAPPER_UPDATES):

  类似咱们自己写的copy_preperties功能;

  wrapper包装函数, wrapped被包装函数;

  元组WRAPPER_ASSIGNMENTS中是要被覆盖的属性:模块名、名称、限定名、文档、参数注解

WRAPPER_ASSIGNMENTS = ()

  元组WRAPPER_UPDATES中是要被更新的属性,__dict__属性字典:  

WRAPPER_UPDATES = ('__dict__',)

  增加一个__wrapped__属性,保留着wrapped函数;


import datetime, time, functools

def logger(fn):
    # @copy_properties(fn)
    def wrap(*args, **kwargs):
        """This is a wrapper"""
        #before 功能增强
        print("args={},kwargs={}".fORMat(args, kwargs))
        start = datetime.datetime.now()
        ret = fn(*args, **kwargs)
        #after 功能增强
        duration = datetime.datetime.now() - start
        print("function {} took {}s.".format(fn.__name__, duration.total_seconds()))
        return ret
    functools.update_wrapper(wrap, fn)# 这里就等价于@copy_properties(fn)
    print("{} {}".format(id(wrap), id(fn)))# 这里是为了确认一下,add.__wrapped__到底是wrap,还是fn
    return wrap

@logger
def add(x, y):
    """This is a function"""
    print("======call add======")
    time.sleep(2)
    return x + y

print(add.__wrapped__)
print(id(add.__wrapped__))

其实按照源码来写的话,return wrap 可以直接写成return functools.update_wrapper(wrap, fn),为什么直接能这样写,自己看源码?



上面的方法,我们很少这样用,我们真正要用的是@functools.wraps(fn)

import datetime, time, functools

def logger(fn):
    @functools.wraps(fn)
    def wrap(*args, **kwargs):
        """This is a wrapper"""
        start = datetime.datetime.now()
        ret = fn(*args, **kwargs)
        duration = datetime.datetime.now() - start
        print("function {} took {}s.".format(fn.__name__, duration.total_seconds()))
        return ret
    return wrap

@logger# add = logger(add)
def add(x, y):
    """This is a function"""
    print("======call add======")
    time.sleep(2)
    return x + y

print(add.__name__, add.__wrapped__)



partial方法

  偏函数,把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成一个新的函数并返回;

  从partial生成的新函数,是对原函数的封装;

举例说明:

import functools
import inspect

def add(x, y) -> int:
    return x + y
print(inspect.signature(add)) #(x, y) -> int
newadd = functools.partial(add, y=5)

print(newadd(5))
print(newadd(5)) #TypeError: add() Got multiple values for argument 'y'
print(newadd(7, y=6))
print(newadd(y=6, x=10))

print(inspect.signature(newadd)) #这里是看一下新函数的签名,(x, *, y=5) -> int

更复杂一点:

import functools
import inspect

def add(x, y, *args) ->int:
    print(args)
    return x + y

newadd = functools.partial(add, 1, 3, 6, 5)
print(newadd(7))
print(newadd(7, 10))
# print(newadd(7, 10, y=20, x=10))###
print(newadd())

print(inspect.signature(newadd))



lru_cache:

  @functools.lru_cache(maxsize=128, typed=False)

  least-recently-used装饰器。lru,最近最少使用,cache缓存

  如果maxsize设置为None,则禁用LRU功能,并且缓存可以当无限制增长。

  当maxsize是二的幂时,LRU功能执行得最好。

  如果typed设置为True,则不同类型的函数参数将单独缓存。例如,f(3)和f(3.0)将被视为具有不同结果的不同调用。

import functools, time

@functools.lru_cache()
def add(x, y, z=3):
    time.sleep(z)
    return x + y

print(add(4, 5))
print(add(4, 5))
print(add(4, 5))
print(add(4, 5))

#在ipython里看的效果会更清楚


--结束END--

本文标题: Python的functools模块

本文链接: https://www.lsjlt.com/news/186560.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python的functools模块
    (wrapperwrappedassigned = WRAPPER_ASSIGNMENTSupdated = WRAPPER_UPDATES):  类似咱们自己写的copy_preperties功能;  wrapper包装函数, wrapp...
    99+
    2023-01-31
    模块 Python functools
  • python模块之functools
    functools模块提供了某些高阶函数(high-order function)。 functools.cmp_to_key(func) 比较函数是接收两个参数进行比较的函数,返回一个负数表示<,返回0表示=,返回一个正数表示&g...
    99+
    2023-01-31
    模块 python functools
  • 5-functools模块
    functools 包含了用于创建装饰函数,启动面向切面的编程,超出面向对象编程范围的代码复用,同时提供了装饰函数用于丰富的快捷比较的API, partial 模块还创建了包含函数参数的函数引用,也就是偏函数 partial 偏函数 p...
    99+
    2023-01-31
    模块 functools
  • Python的functools模块使用总结
    本篇文章给大家带来了关于Python的相关知识,主要介绍了Python的functools模块使用及说明,具有很好的参考价值,下面一起来看一下,希望对大家有帮助。【相关推荐:Python3视频教程 】partial用于创建一个偏函数,将默认...
    99+
    2022-08-08
    python
  • Python的functools模块使用及说明
    目录partialupdate_wrapperwrapsreducecmp_to_keylru_cachesingledispatchpartial 用于创建一个偏函数,将...
    99+
    2022-11-11
  • Python中functools模块函数解析
    Python自带的 functools 模块提供了一些常用的高阶函数,也就是用于处理其它函数的特殊函数。换言之,就是能使用该模块对可调用对象进行处理。 functools模块函数概览 functoo...
    99+
    2022-06-04
    函数 模块 Python
  • Python中functools模块的常用函数解析
    1.partial 首先是partial函数,它可以重新绑定函数的可选参数,生成一个callable的partial对象: >>> int('10') # 实际上等同于int('10'...
    99+
    2022-06-04
    函数 模块 常用
  • python高阶函数functools模块如何使用
    本篇内容主要讲解“python高阶函数functools模块如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python高阶函数functools模块如何使用”吧!functools模块提...
    99+
    2023-07-05
  • Python使用functools模块中的partial函数生成偏函数
    python 中提供一种用于对函数固定属性的函数(与数学上的偏函数不一样) # 通常会返回10进制 int('12345') # print 12345 # 使用参数 返回 8进制 int('11...
    99+
    2022-06-04
    函数 模块 Python
  • Python编程functools模块创建修改的高阶函数解析
    目录partial 函数装饰器 @lru_cachereduce 函数partial 函数 partial 为偏函数(有的地方也叫做部分应用函数),它是对函数的二次封装,将现有函数的...
    99+
    2022-11-12
  • python模块:smtplib模块
    1.使用本地的sendmail协议进行邮件发送格式(1):smtpObj=smtplib.SMTP([host [,port [,local_hostname]]])host:SMTP服务器主机的IP地址或者是域名port:服务的端口号(默...
    99+
    2023-01-31
    模块 python smtplib
  • Python模块:time模块
    time模块:python中处理时间的基础模块,有时间戳,元组,自定义,三种时间表现形式。python中时间戳的值是以1970年1月1日0点开始计算的,单位是秒。时间戳:就是两个时间差的数值。时区:传说中在开发服务器/客户端程序时,时区不一...
    99+
    2023-01-31
    模块 Python time
  • Python中的sys模块、random模块和math模块
    一、sys运行时环境模块 sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。 用法: sys.argv:命令行参数List,第...
    99+
    2022-11-11
  • python中的sys模块和os模块
    目录1.sys模块2.os模块(和操作系统相关数据)1.sys模块 sys模块的常见函数列表: sys.argv: 实现从程序外部向程序传递参数。sys.exit([arg]): 程...
    99+
    2022-11-13
  • Python中的time模块和calendar模块
    目录1、时间戳2、时间元组3、获取当前时间4、格式化时间5、格式化日期6、获取CPU时间7、日历模块在Python中对时间和日期的处理方式有很多,其中转换日期是最常见的一个功能。Py...
    99+
    2022-11-12
  • python模块学习(queue模块的Q
    学习版本3.5.2 PriorityQueue类和LifoQueue类继承Queue类然后重写了_init、_qsize、_put、_get这四个类的私有方法 Queue:先进先出队列的同步实现,通过双向列表实现的 # Initi...
    99+
    2023-01-31
    模块 python queue
  • python中的deque模块(collections的deque模块)
    目录 1. deque是python的collections中的一个类 2.deque的简单使用以及它的方法 2.1 创建deque的方法  2.2 创建deque时,并指定大小maxlen,即能装几个元素, 以及d...
    99+
    2023-09-25
    python 开发语言 collections deque 队列
  • 使用Python模块:struct模块
    Python没有提供直接的将用户定义的数据类型和文件IO关联起来的功能,但是它提供了struct库(是一个内置库)——我们可以以二进制模式来写这些数据(有趣的是,它真的是设计来讲文本数据写为缓存的) 1)bytes、str...
    99+
    2023-01-31
    模块 Python struct
  • python模块学习----nmap模块
    安装nmap模块:pip install python_nmanmap模块说明:python-nmap是一个帮助使用nmap端口扫描器的python库。它允许轻松操纵nmap扫描结果,并且将是一个完美的选择,为需要自动完成扫描任务的系统管理...
    99+
    2023-01-31
    模块 python nmap
  • python加密模块-hashlib模块
    hashlib模块 用于加密相关的操作,3.X里代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法 (sha比md5 更复杂、md5 不能反解) 具体应用:用于网站防篡改。具...
    99+
    2023-01-31
    模块 python hashlib
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作