成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 中的 @wraps 到底是個啥東西?

開發 前端
更具體地說,@wraps(something)? 用 something 的元數據覆蓋了函數的元數據。這樣,我們原來函數的元數據就不會丟失了。

只要你讀得很快

你可能在隨意的 Python 代碼中見過這個 @wraps 的東西,你可能想知道這到底是什么?

函數有元數據

元數據指的是函數本身的數據。

def apple():
  '''a function that prints apple'''
  print('apple')

print(apple.__name__)  # apple
print(apple.__doc__)   # 打印apple的函數

例子包括函數名 .__name__ 或函數 docstring .__doc__

裝飾器如何工作

裝飾器用于改變函數的行為方式,而無需修改任何源代碼。

def greet(name):
    return 'hello ' + name

print(greet('tom'))  # hello tom

在這里,我們有一個普通的 greet 功能

def add_exclamation(func):
    def wrapper(name):
        return func(name) + '!'
    return wrapper

@add_exclamation
def greet(name):
    return 'hello ' + name

print(greet('tom'))  # hello tom!

我們通過在 greet() 上添加 @add_exclamation 來用 add_exclamation() 來裝飾 greet()。這里,add_exclamation 是裝飾器,greet 是被裝飾的函數。

請注意,greet() 的行為已經改變,而我們根本沒有編輯 greet() 的源代碼。這是裝飾器的功勞。

裝飾語法魔術

def add_exclamation(func):
    def wrapper(name):
        return func(name) + '!'
    return wrapper

@add_exclamation
def greet(name):
    return 'hello ' + name

print(greet('tom'))  # hello tom!

這是完全相同的:

def add_exclamation(func):
    def wrapper(name):
        return func(name) + '!'
    return wrapper

def greet(name):
    return 'hello ' + name

greet = add_exclamation(greet)

print(greet('tom'))  # hello tom!

注意 “greet = add_exclamation(greet) ”一行。

裝飾會導致元數據丟失

# 沒有裝飾
def greet(name):
  '''says hello to someone'''
  return 'hello ' + name

print(greet.__name__)  # greet
print(greet.__doc__)   # says hello to someone

在這里,我們可以順利打印 greet() 的元數據。

# 加了裝飾
def add_exclamation(func):
    def wrapper(name):
        return func(name) + '!'
    return wrapper

@add_exclamation
def greet(name):
  '''says hello to someone'''
  return 'hello ' + name

print(greet.__name__)  # wrapper
print(greet.__doc__)   # None

用 add_exclamation 裝飾 greet 后,請注意元數據發生了變化。__name__ 變成了 “wrapper”,而 __doc__ 變成了 wrapper 的 docstring。

這是因為當我們裝飾 greet 時,我們實際上是在做這件事:

greet = add_exclamation(greet)

我們正在將 greet 重新分配給一個由 add_exclamation 返回的函數--wrapper。

這就是為什么當我們嘗試打印 greet.__name__ 和 greet.__doc__ 時,會打印 wrapper 的元數據的原因。

@wraps 防止元數據在裝飾過程中丟失

from functools import wraps

def add_exclamation(func):
    @wraps(func)
    def wrapper(name):
        return func(name) + '!'
    return wrapper

@add_exclamation
def greet(name):
  '''says hello to someone'''
  return 'hello ' + name

print(greet.__name__)  # greet
print(greet.__doc__)   # says hello to someone

請注意,盡管使用了 ad_exclamation 裝飾,greet 的元數據還是回到了正常狀態。

更具體地說,@wraps(something) 用 something 的元數據覆蓋了函數的元數據。這樣,我們原來函數的元數據就不會丟失了。

責任編輯:武曉燕 來源: 數據STUDIO
相關推薦

2022-04-10 19:26:07

TypeScript類型語法

2024-08-26 14:23:56

2024-02-07 12:35:00

React并發模式concurrent

2021-01-08 09:48:18

Pythonname變量

2021-12-16 15:11:59

Facebook天秤幣加密貨幣

2022-09-06 21:38:45

數字人數字孿生

2021-05-11 07:30:58

JNIJavaAPI

2022-05-04 08:38:32

Netty網絡框架

2021-01-28 17:41:32

Github網站Pull Reques

2021-12-26 00:01:51

Log4Shell漏洞服務器

2024-08-01 17:34:56

Promiseaxios請求

2020-10-25 20:05:29

Pythonyield開發

2020-03-07 09:47:48

AVL樹算法場景

2024-02-01 20:15:37

2013-05-29 10:17:56

Hadoop分布式文件系統

2012-07-25 09:09:46

GNOME OS桌面

2011-12-28 09:53:18

HTML 5

2021-02-01 06:41:47

流水線計算機隊列

2021-12-16 21:13:38

通信網管平臺

2019-10-28 09:59:26

區塊鏈技術智能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品污www在线观看 | 日韩精品一区二区三区在线播放 | 色综合一区二区三区 | 91影库 | 国产一级在线 | 成人一区二区视频 | 日韩电影中文字幕 | 欧洲亚洲视频 | 男女在线免费观看 | 成人午夜免费在线视频 | 欧美舔穴| 福利视频一区 | av片免费| 日韩欧美成人一区二区三区 | 亚洲最大的黄色网址 | 欧美日本免费 | 久久精品女人天堂av | 精品国产精品国产偷麻豆 | 一区二区三区在线观看免费视频 | 青娱乐自拍 | 成人精品毛片国产亚洲av十九禁 | 国产精品99久久免费观看 | 黄色毛片免费视频 | 亚洲精品自在在线观看 | 日本久久久久久 | 亚洲 欧美 日韩 在线 | 国产成人jvid在线播放 | 亚洲美女一区 | 久久久日韩精品一区二区三区 | 一区二区三区免费 | 免费成人高清在线视频 | 欧美视频在线观看 | 亚洲成人三区 | 2020亚洲天堂 | 99tv成人影院 | 欧美黄色一级毛片 | 欧美精品在线一区二区三区 | 国产精品久久久99 | av天天看 | 夜夜精品视频 | 综合色播 |