当前位置:首页 > 科技  > 软件

Python 中的 @wraps 到底是个啥东西?

来源: 责编: 时间:2024-07-12 17:21:21 204观看
导读只要你读得很快你可能在随意的 Python 代码中见过这个 @wraps 的东西,你可能想知道这到底是什么?函数有元数据元数据指的是函数本身的数据。def apple(): '''a function that prints apple''' print('apple')print(ap

只要你读得很快

你可能在随意的 Python 代码中见过这个 @wraps 的东西,你可能想知道这到底是什么?TfC28资讯网——每日最新资讯28at.com

函数有元数据

元数据指的是函数本身的数据。TfC28资讯网——每日最新资讯28at.com

def apple():  '''a function that prints apple'''  print('apple')print(apple.__name__)  # appleprint(apple.__doc__)   # 打印apple的函数

例子包括函数名 .__name__ 或函数 docstring .__doc__TfC28资讯网——每日最新资讯28at.com

装饰器如何工作

装饰器用于改变函数的行为方式,而无需修改任何源代码。TfC28资讯网——每日最新资讯28at.com

def greet(name):    return 'hello ' + nameprint(greet('tom'))  # hello tom

在这里,我们有一个普通的 greet 功能TfC28资讯网——每日最新资讯28at.com

def add_exclamation(func):    def wrapper(name):        return func(name) + '!'    return wrapper@add_exclamationdef greet(name):    return 'hello ' + nameprint(greet('tom'))  # hello tom!

我们通过在 greet() 上添加 @add_exclamation 来用 add_exclamation() 来装饰 greet()。这里,add_exclamation 是装饰器,greet 是被装饰的函数。TfC28资讯网——每日最新资讯28at.com

请注意,greet() 的行为已经改变,而我们根本没有编辑 greet() 的源代码。这是装饰器的功劳。TfC28资讯网——每日最新资讯28at.com

装饰语法魔术

def add_exclamation(func):    def wrapper(name):        return func(name) + '!'    return wrapper@add_exclamationdef greet(name):    return 'hello ' + nameprint(greet('tom'))  # hello tom!

这是完全相同的:TfC28资讯网——每日最新资讯28at.com

def add_exclamation(func):    def wrapper(name):        return func(name) + '!'    return wrapperdef greet(name):    return 'hello ' + namegreet = add_exclamation(greet)print(greet('tom'))  # hello tom!

注意 “greet = add_exclamation(greet) ”一行。TfC28资讯网——每日最新资讯28at.com

装饰会导致元数据丢失

# 没有装饰def greet(name):  '''says hello to someone'''  return 'hello ' + nameprint(greet.__name__)  # greetprint(greet.__doc__)   # says hello to someone

在这里,我们可以顺利打印 greet() 的元数据。TfC28资讯网——每日最新资讯28at.com

# 加了装饰def add_exclamation(func):    def wrapper(name):        return func(name) + '!'    return wrapper@add_exclamationdef greet(name):  '''says hello to someone'''  return 'hello ' + nameprint(greet.__name__)  # wrapperprint(greet.__doc__)   # None

用 add_exclamation 装饰 greet 后,请注意元数据发生了变化。__name__ 变成了 “wrapper”,而 __doc__ 变成了 wrapper 的 docstring。TfC28资讯网——每日最新资讯28at.com

这是因为当我们装饰 greet 时,我们实际上是在做这件事:TfC28资讯网——每日最新资讯28at.com

greet = add_exclamation(greet)

我们正在将 greet 重新分配给一个由 add_exclamation 返回的函数--wrapper。TfC28资讯网——每日最新资讯28at.com

这就是为什么当我们尝试打印 greet.__name__ 和 greet.__doc__ 时,会打印 wrapper 的元数据的原因。TfC28资讯网——每日最新资讯28at.com

@wraps 防止元数据在装饰过程中丢失

from functools import wrapsdef add_exclamation(func):    @wraps(func)    def wrapper(name):        return func(name) + '!'    return wrapper@add_exclamationdef greet(name):  '''says hello to someone'''  return 'hello ' + nameprint(greet.__name__)  # greetprint(greet.__doc__)   # says hello to someone

请注意,尽管使用了 ad_exclamation 装饰,greet 的元数据还是回到了正常状态。TfC28资讯网——每日最新资讯28at.com

更具体地说,@wraps(something) 用 something 的元数据覆盖了函数的元数据。这样,我们原来函数的元数据就不会丢失了。TfC28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-100714-0.htmlPython 中的 @wraps 到底是个啥东西?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 聊聊2024年Rust加密生态系统

下一篇: 使用 Docker 搭建 NodeJS 开发环境是一种什么体验?

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的“在线鉴别”,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对“势”的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为“纯欲天花板”的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
Top