当前位置: 首页 > news >正文

学网站制作多少钱嘉定企业网站建设

学网站制作多少钱,嘉定企业网站建设,重装电脑后wordpress,兰州官网seo哪家公司好在了解wraps修饰器之前,我们首先要了解partial和update_wrapper这两个函数,因为在wraps的代码中,用到了这两个函数。 partial 首先说partial函数,在官方的描述中,这个函数的声明如下:functools.partial(f…

在了解wraps修饰器之前,我们首先要了解partialupdate_wrapper这两个函数,因为在wraps的代码中,用到了这两个函数。

partial

首先说partial函数,在官方的描述中,这个函数的声明如下:functools.partial(func, *args, **keywords)。它的作用就是返回一个partial对象,当这个partial对象被调用的时候,就像通过func(*args, **kwargs)的形式来调用func函数一样。如果有额外的 位置参数(args) 或者 关键字参数(*kwargs) 被传给了这个partial对象,那它们也都会被传递给func函数,如果一个参数被多次传入,那么后面的值会覆盖前面的值。

比如下面这个例子:

from functools import partialdef add(x:int, y:int):return x+y# 这里创建了一个新的函数add2,只接受一个整型参数,然后将这个参数统一加上2
add2 = partial(add, y=2)add2(3)  # 这里将会输出5

这个函数是使用C而不是Python实现的,但是官方文档中给出了Python实现的代码,如下所示,大家可以进行参考:

def partial(func, *args, **keywords): def newfunc(*fargs, **fkeywords): newkeywords = keywords.copy() newkeywords.update(fkeywords) return func(*args, *fargs, **newkeywords) newfunc.func = func newfunc.args = args newfunc.keywords = keywords return newfunc

update_wrapper

接下来,我们再来聊一聊update_wrapper这个函数,顾名思义,这个函数就是用来更新修饰器函数的,具体更新些什么呢,我们可以直接把它的源码搬过来看一下:

def update_wrapper(wrapper,wrapped,assigned = WRAPPER_ASSIGNMENTS,updated = WRAPPER_UPDATES):"""Update a wrapper function to look like the wrapped functionwrapper is the function to be updatedwrapped is the original functionassigned is a tuple naming the attributes assigned directlyfrom the wrapped function to the wrapper function (defaults tofunctools.WRAPPER_ASSIGNMENTS)updated is a tuple naming the attributes of the wrapper thatare updated with the corresponding attribute from the wrappedfunction (defaults to functools.WRAPPER_UPDATES)"""for attr in assigned:try:value = getattr(wrapped, attr)except AttributeError:passelse:setattr(wrapper, attr, value)for attr in updated:getattr(wrapper, attr).update(getattr(wrapped, attr, {}))# Issue #17482: set __wrapped__ last so we don't inadvertently copy it# from the wrapped function when updating __dict__wrapper.__wrapped__ = wrapped# Return the wrapper so this can be used as a decorator via partial()return wrapper

大家可以发现,这个函数的作用就是从 被修饰的函数(wrapped) 中取出一些属性值来,赋值给 修饰器函数(wrapper) 。为什么要这么做呢,我们看下面这个例子。

自定义修饰器v1

首先我们写个自定义的修饰器,没有任何的功能,仅有文档字符串,如下所示:

def wrapper(f):def wrapper_function(*args, **kwargs):"""这个是修饰函数"""return f(*args, **kwargs)return wrapper_function@wrapper
def wrapped():"""这个是被修饰的函数"""print('wrapped')print(wrapped.__doc__)  # 输出`这个是修饰函数`
print(wrapped.__name__)  # 输出`wrapper_function`

从上面的例子我们可以看到,我想要获取wrapped这个被修饰函数的文档字符串,但是却获取成了wrapper_function的文档字符串,wrapped函数的名字也变成了wrapper_function函数的名字。这是因为给wrapped添加上@wrapper修饰器相当于执行了一句wrapped = wrapper(wrapped),执行完这条语句之后,wrapped函数就变成了wrapper_function函数。遇到这种情况该怎么办呢,首先我们可以手动地在wrapper函数中更改wrapper_function__doc____name__属性,但聪明的你肯定也想到了,我们可以直接用update_wrapper函数来实现这个功能。

自定义修饰器v2

我们对上面定义的修饰器稍作修改,添加了一句update_wrapper(wrapper_function, f)

from functools import update_wrapperdef wrapper(f):def wrapper_function(*args, **kwargs):"""这个是修饰函数"""return f(*args, **kwargs)update_wrapper(wrapper_function, f)  # <<  添加了这条语句return wrapper_function@wrapper
def wrapped():"""这个是被修饰的函数"""print('wrapped')print(wrapped.__doc__)  # 输出`这个是被修饰的函数`
print(wrapped.__name__)  # 输出`wrapped`

此时我们可以发现,__doc____name__属性已经能够按我们预想的那样显示了,除此之外,update_wrapper函数也对__module____dict__等属性进行了更改和更新。

wraps修饰器

OK,至此,我们已经了解了partialupdate_wrapper这两个函数的功能,接下来我们翻出wraps修饰器的源码:

WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__','__annotations__')
WRAPPER_UPDATES = ('__dict__',)
def wraps(wrapped,assigned = WRAPPER_ASSIGNMENTS,updated = WRAPPER_UPDATES):"""Decorator factory to apply update_wrapper() to a wrapper functionReturns a decorator that invokes update_wrapper() with the decoratedfunction as the wrapper argument and the arguments to wraps() as theremaining arguments. Default arguments are as for update_wrapper().This is a convenience function to simplify applying partial() toupdate_wrapper()."""return partial(update_wrapper, wrapped=wrapped,assigned=assigned, updated=updated)

没错,就是这么的简单,只有这么一句,我们可以看出,wraps函数其实就是一个修饰器版的update_wrapper函数,它的功能和update_wrapper是一模一样的。我们可以修改我们上面的自定义修饰器的例子,做出一个更方便阅读的版本。

自定义修饰器v3

from functools import wrapsdef wrapper(f):@wraps(f)def wrapper_function(*args, **kwargs):"""这个是修饰函数"""return f(*args, **kwargs)return wrapper_function@wrapper
def wrapped():"""这个是被修饰的函数"""print('wrapped')print(wrapped.__doc__)  # 输出`这个是被修饰的函数`
print(wrapped.__name__)  # 输出`wrapped`

至此,我想大家应该明白wraps这个修饰器的作用了吧,就是将 被修饰的函数(wrapped) 的一些属性值赋值给 修饰器函数(wrapper) ,最终让属性的显示更符合我们的直觉。

http://www.yayakq.cn/news/684746/

相关文章:

  • 网站数据库名称怎么改上传网站视频要怎么做才清楚
  • 网站优化团队做网站需要租空间吗
  • 重庆建设招标网站移动网站屏蔽
  • 做数据分析好看的网站html5国内网站建设
  • 小学生网上学做辅导哪个网站好小型电商平台有哪些
  • 有做分期海淘的网站吗推广项目网站
  • 深圳英文网站制作做任务分享赚钱的网站
  • 做网站能致富吗网站建设外包协议
  • 洛阳微网站建设wordpress 显示不全
  • VIP视频自助网站建设软件外包公司哪个好
  • 济南网站建设艮安特效音网站
  • 湖南专业建站按效果付贿推荐网站建设公司
  • 怎么在后台设置网站的关键词注册域名之后怎么做网站
  • 河北网站推广优化关于网站优化的文章
  • 专业建设网站多少钱郑州网站制作哪家招聘
  • 怎么用dw做带登陆的网站办公空间设计网站
  • 注册域名成功后怎样建设网站教学网站开发源码
  • 上海seo整站优化做酱菜网站
  • 用c 做毕业设计的音乐网站hs网站推广
  • 深圳网站建设 排行榜企业建网站多少钱
  • 网站建设 没市场了吧怎么自己创建网页
  • 天津商城网站设计公司校园网站制作
  • 青岛贸易公司 网站制作wordpress分类图片尺寸
  • 淘宝做链接有哪些网站可以做卖服务器建网站
  • 免费的ppt模板网站有哪些建设库
  • 学院网站建设目标哪个网站用div做的好
  • 购物网站线下推广办法ui设计师需要会的软件
  • 九口袋网站建设大连网站建设找简维科技
  • 搜狐做app的网站网站无法收录
  • 做个营销型网站怎样对一个网站做seo