91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

讓你學(xué)寫(xiě)Python裝飾器的五大理由

馬哥Linux運(yùn)維 ? 來(lái)源:xx ? 2019-03-02 10:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

你必須學(xué)寫(xiě)Python裝飾器的五個(gè)理由

----裝飾器能對(duì)你所寫(xiě)的代碼產(chǎn)生極大的正面作用

作者:Aaron Maxwell,2016年5月5日

Python裝飾器是很容易使用的。任何一個(gè)會(huì)寫(xiě)Python函數(shù)的人都能夠?qū)W會(huì)使用裝飾器,比如下面這個(gè):\

@somedecoratordef some_function(): print("Check it out, I"m using decorators!")

但是,寫(xiě)出一個(gè)裝飾器是一個(gè)完全不一樣的技能。而且這也不是,你不得不理解下面這些:

閉包

如何將函數(shù)作為"第一類(lèi)"參數(shù)來(lái)使用

變量參數(shù)

參數(shù)解包

甚至是Python是如何裝載源碼的一些細(xì)節(jié)

所有這些都需要花很多時(shí)間去理解和掌握。而且當(dāng)你已經(jīng)有這么一堆事情要學(xué)的時(shí)候,這些值得你花時(shí)間嗎?

對(duì)我來(lái)說(shuō),這個(gè)問(wèn)題的答案已然是上千次的“肯定,是的,我會(huì)學(xué)習(xí)!”

寫(xiě)裝飾器的最重要的好處是什么呢?在你每天的開(kāi)發(fā)中,裝飾器讓你做什么做起來(lái)是很容易并且很強(qiáng)大的呢?

分析、日志以及指導(dǎo)

尤其是在大型軟件中,我們通常需要專(zhuān)門(mén)來(lái)測(cè)試到底發(fā)生了什么,以及記錄那些能量化不同行為的指標(biāo)。通過(guò)在裝飾器內(nèi)部的函數(shù)或者方法里面封裝這些重要的事件,這個(gè)裝飾器能通俗易懂且容易地處理剛才這些所講的需求。比如:

from myapp.log import logger def log_order_event(func): def wrapper(*args, **kwargs): logger.info("Ordering: %s", func.__name__) order = func(*args, **kwargs) logger.debug("Order result: %s", order.result) return order return wrapper @log_order_event def order_pizza(*toppings): # let"s get some pizza!

同樣的方式可以被用來(lái)計(jì)數(shù)或者其他指標(biāo)。

驗(yàn)證與運(yùn)行檢查

Python的類(lèi)型系統(tǒng)是相當(dāng)類(lèi)型化了的,但是也是很動(dòng)態(tài)的。對(duì)于它的這些所有的好處,也意味著某一些bugs能夠悄悄產(chǎn)生,而這些bugs能夠在編譯的時(shí)候被更類(lèi)型化的語(yǔ)言(比如Java)所捕獲。即使更長(zhǎng)遠(yuǎn)看,你可能需要強(qiáng)化更復(fù)雜的,在數(shù)據(jù)進(jìn)出的時(shí)候能個(gè)性化檢查。裝飾器能讓你易于處理所有這些,并能一次性地應(yīng)用它到很多函數(shù)上。

假設(shè):你有一堆函數(shù),每個(gè)函數(shù)都返回一個(gè)字典,這個(gè)字典包含一個(gè)稱(chēng)作“summary”的字段。這個(gè)字段的值不能超過(guò)80個(gè)字符長(zhǎng)度;如果違反了,就是不對(duì)的。這里給出一個(gè)裝飾器,當(dāng)條件不滿足的時(shí)候它能夠拋出一個(gè)值錯(cuò)誤(ValueError),如下:

def validate_summary(func): def wrapper(*args, **kwargs): data = func(*args, **kwargs) if len(data["summary"]) > 80: raise ValueError("Summary too long") return data return wrapper @validate_summary def fetch_customer_data(): # ... @validate_summary def query_orders(criteria): # ... @validate_summary def create_invoice(params): # ...

創(chuàng)建框架

一旦你掌握了裝飾器的編程,你將能夠受益于使用裝飾器的簡(jiǎn)單語(yǔ)法,而這讓你增加語(yǔ)意給你的代碼以便容易使用它。這就是下一個(gè)能夠擴(kuò)展Python自身語(yǔ)法的最好的工具。

實(shí)際中,很多流行的開(kāi)源框架都在使用裝飾器。網(wǎng)頁(yè)應(yīng)用框架Flask就使用了裝飾器將URLs的路由交給那些處理HTTPS請(qǐng)求的函數(shù)。

# For a RESTful todo-list API. @app.route("/tasks/", methods=["GET"]) def get_all_tasks(): tasks = app.store.get_all_tasks() return make_response(json.dumps(tasks), 200) @app.route("/tasks/", methods=["POST"]) def create_task(): payload = request.get_json(force=True) task_id = app.store.create_task( summary = payload["summary"], description = payload["description"], ) task_info = {"id": task_id} return make_response(json.dumps(task_info), 201) @app.route("/tasks//") def task_details(task_id): task_info = app.store.task_details(task_id) if task_info is None: return make_response("", 404) return json.dumps(task_info)

在這里,你有一個(gè)被叫做app的全局的對(duì)象,它有一個(gè)被稱(chēng)作route(路由)的方法并接受特定參數(shù)。這個(gè)路由方法返回一個(gè)被應(yīng)用到處理函數(shù)的裝飾器。在這個(gè)“面罩”下發(fā)生了一些很錯(cuò)綜復(fù)雜的的事情,但是從Flask的使用者角度看,所有這些復(fù)雜性是完全被隱藏起來(lái)的了。

以這樣的方式使用裝飾器在stock Python中也有體現(xiàn)。舉個(gè)例子,完全使用對(duì)象系統(tǒng)是有賴(lài)于@classmethod和@property裝飾器的:

class WeatherSimulation: def __init__(self, **params): self.params = params @classmethod def for_winter(cls, **other_params): params = {"month": "Jan", "temp": "0"} params.update(other_params) return cls(**params) @property def progress(self): return self.completed_iterations() / self.total_iterations()

這個(gè)類(lèi)有3個(gè)不同的定義聲明。但是,他們的語(yǔ)意是各不相同的。

1:constructor是一個(gè)正常方法

2:for_winter是一個(gè)類(lèi)方法且提供一種類(lèi)似于“車(chē)間”的東西

3:progess是只讀、動(dòng)態(tài)屬性

對(duì)于日常來(lái)說(shuō),@classmethod和@property兩個(gè)裝飾器如此簡(jiǎn)單以致可以很容易擴(kuò)展Python的對(duì)象語(yǔ)意

復(fù)用那些不可能復(fù)用的代碼

Python提供給你一些很強(qiáng)大的工具用以封裝代碼為一個(gè)易用的形式,并帶有充分的函數(shù)表示語(yǔ)法,支持函數(shù)式編程以及全面的對(duì)象系統(tǒng)。但是,裝飾器也有它所不能捕獲的某些形式的代碼復(fù)用。

比如使用一個(gè)不可靠的API。你給那些通過(guò)HTTP對(duì)話的JSON發(fā)出一些請(qǐng)求的時(shí)候,API可以99.9%的時(shí)候工作正常。但是,有一小部分請(qǐng)求將使得服務(wù)器返回一個(gè)內(nèi)部錯(cuò)誤,然后你需要重試這些請(qǐng)求。在這個(gè)情況下,你將寫(xiě)一個(gè)重試邏輯,比如:

resp = None while True: resp = make_api_call() if resp.status_code == 500 and tries < MAX_TRIES: ? ? ? ? ? ?tries += 1 ? ? ? ? ? ?continue ? ? ? ?break ? ?process_response(resp)

現(xiàn)在,假設(shè)你有十多個(gè)類(lèi)似于make_api_call的函數(shù),并且他們被所有代碼調(diào)用。那么你是想要每次調(diào)用它們的時(shí)候?qū)懸粋€(gè)while循環(huán)呢?還是每次增加一個(gè)API調(diào)用函數(shù)的時(shí)候都把這段代碼再寫(xiě)一遍?無(wú)論哪種選擇都會(huì)產(chǎn)生大量的重復(fù)代碼,除非你用裝飾器。用了裝飾器事情就簡(jiǎn)單了。

# 加了裝飾器的函數(shù)會(huì)返回一個(gè)Response對(duì)象,# 這個(gè)對(duì)象有個(gè)一二status_code的屬性,# 200表示成功;500表示服務(wù)器錯(cuò)誤。def retry(func): def retried_func(*args, **kwargs): MAX_TRIES = 3 tries = 0 while True: resp = func(*args, **kwargs) if resp.status_code == 500 and tries < MAX_TRIES: ? ? ? ? ? ? ? ?tries += 1 ? ? ? ? ? ? ? ?continue ? ? ? ? ? ?break ? ? ? ?return resp ? ?return retried_func

上述例子可以讓你方便使用裝飾器@retry

@retry def make_api_call(): # ....

提升你的職業(yè)生涯

編寫(xiě)裝飾器在一開(kāi)始并不容易。它雖然不像火箭科學(xué)但是也需要你花很多努力去學(xué)習(xí),去排除一些細(xì)微差異。很多開(kāi)發(fā)者也從來(lái)不會(huì)通過(guò)這些麻煩而學(xué)習(xí)掌握裝飾器編寫(xiě)。但是學(xué)習(xí)裝飾器的確會(huì)給你優(yōu)勢(shì)。當(dāng)你是你的團(tuán)隊(duì)里面學(xué)習(xí)如何寫(xiě)好裝飾器的那個(gè)人的時(shí)候,并且你寫(xiě)的裝飾器能解決一些實(shí)際問(wèn)題的時(shí)候,其他開(kāi)發(fā)者將會(huì)使用你的裝飾器。因?yàn)椋坏┻@些裝飾器編寫(xiě)的困難的部分被完成了,裝飾器就會(huì)很容易使用。這就對(duì)你所寫(xiě)的代碼產(chǎn)生極大的正面作用。這也會(huì)讓你成為一個(gè)重要角色。

不論你如何編寫(xiě)裝飾器,你會(huì)對(duì)下面你所要做的事情而感到興奮,比如你即將能使用裝飾器來(lái)做一些事情,以及裝飾器是如何能永遠(yuǎn)改變你寫(xiě)Python代碼的方式。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86753

原文標(biāo)題:你必須學(xué)寫(xiě) Python 裝飾器的五個(gè)理由

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    亞馬遜為何收購(gòu)?fù)ㄓ嵐維lack 有以下五大理由

    若干家潛在收購(gòu)方的目標(biāo),它們對(duì)Slack開(kāi)出的報(bào)價(jià)可能達(dá)到90億美元。在這些收購(gòu)方當(dāng)中,就包括了亞馬遜。亞馬遜為何會(huì)收購(gòu)Slack,國(guó)外媒體列舉出了五大理由
    發(fā)表于 06-17 06:00 ?975次閱讀

    從ESA-L系列頻譜分析儀遷移到CXA X系列信號(hào)分析儀的三大理由

    從ESA-L系列頻譜分析儀遷移到CXA X系列信號(hào)分析儀的三大理由
    發(fā)表于 09-28 16:56

    德州儀器轉(zhuǎn)向微型器件的五大理由

    隨著電子電路越來(lái)越小型,它們的組件越來(lái)越智能,并能更加快速地處理更多信息– 因此,在通常情況下,它們所需的芯片也前所未有地減少。多年以來(lái)“小型”一直是關(guān)鍵的半導(dǎo)體趨勢(shì)。德州儀器擁有的多款微型器件可幫您克服各式應(yīng)用中的設(shè)計(jì)難題。以下列出轉(zhuǎn)向小型器件的五大理由。德州儀器LOGO
    發(fā)表于 07-29 08:28

    升級(jí)使用16800或16900系列邏輯分析儀的十大理由

    升級(jí)使用16800或16900系列邏輯分析儀的十大理由
    發(fā)表于 08-04 13:12 ?28次下載

    3D立體電視勢(shì)不可擋的7大疑問(wèn)和4大理由

    3D立體電視勢(shì)不可擋的7大疑問(wèn)和4大理由  10月28日在橫濱舉行的國(guó)際平板顯示大會(huì)(FPDInternational)表明3D立體娛樂(lè)的家用化趨勢(shì)已定,至少索尼、松下等日本消費(fèi)電子巨頭
    發(fā)表于 11-07 08:45 ?1069次閱讀

    由Windows 2000升級(jí)至2003/XP的10大理由

    由Windows 2000升級(jí)至2003/XP的10大理由  Windows Server 2003是在可靠的Windows 2000 Server系列的基礎(chǔ)上生成的,它集成了功能強(qiáng)大的應(yīng)用程序環(huán)境以開(kāi)發(fā)全
    發(fā)表于 01-29 11:53 ?1134次閱讀

    愛(ài)上蘋(píng)果機(jī)的6大理由

    愛(ài)上蘋(píng)果機(jī)的6大理由 1. 蘋(píng)果不需要?dú)⒍拒浖? 其實(shí)殺毒軟件也是病毒.-殺毒軟件的電腦變慢. 并且它跟病毒一樣時(shí)時(shí)刻刻
    發(fā)表于 02-26 16:55 ?785次閱讀

    使用LabVIEW軟件進(jìn)行數(shù)據(jù)采集和信號(hào)處理的10大理由

    使用LabVIEW軟件進(jìn)行數(shù)據(jù)采集和信號(hào)處理的10大理由,很直得一看哦。
    發(fā)表于 09-03 17:27 ?5133次閱讀

    大理由:XTREMIO 應(yīng)用于數(shù)據(jù)庫(kù)

    大理由:XTREMIO 應(yīng)用于數(shù)據(jù)庫(kù)
    發(fā)表于 12-25 00:25 ?0次下載

    Fibridge-DVP 代替 DVR的七大理由

    Fibridge-DVP 代替 DVR的七大理由
    發(fā)表于 12-26 22:06 ?0次下載

    關(guān)注C-RAN的五大理由

    業(yè)務(wù)的使用者都應(yīng)該對(duì)C-RAN有所關(guān)心,為什么呢?這里給出五大理由。陳述這些理由之前,先來(lái)快速概括一下C-RAN的技術(shù)。
    發(fā)表于 11-17 16:14 ?3114次閱讀

    自動(dòng)焊接機(jī)器人的五大購(gòu)買(mǎi)理由

    為什么購(gòu)買(mǎi)自動(dòng)焊接機(jī)器人?在科學(xué)技術(shù)飛速發(fā)展的當(dāng)今社會(huì),企業(yè)需要順應(yīng)時(shí)代發(fā)展的步伐,提高自身的自動(dòng)化水平來(lái)實(shí)現(xiàn)轉(zhuǎn)型升級(jí),自動(dòng)焊接機(jī)器人在焊接行業(yè)中的應(yīng)用越來(lái)越廣泛,逐漸代替了傳統(tǒng)手動(dòng)焊接,小編總結(jié)了自動(dòng)焊接機(jī)器人購(gòu)買(mǎi)的五大理由,我們一起往下看。
    發(fā)表于 01-15 15:54 ?715次閱讀

    必須自動(dòng)化SAN環(huán)境的5大理由

    電子發(fā)燒友網(wǎng)站提供《必須自動(dòng)化SAN環(huán)境的5大理由.pdf》資料免費(fèi)下載
    發(fā)表于 08-29 15:12 ?1次下載
    <b class='flag-5'>你</b>必須自動(dòng)化SAN環(huán)境的5<b class='flag-5'>大理由</b>

    如何寫(xiě)一個(gè)簡(jiǎn)單的裝飾

    要的是,它 Python 中被裝飾裝飾后的方法長(zhǎng)得更像裝飾前的方法。 本篇文章不會(huì)過(guò)多的向你
    的頭像 發(fā)表于 11-01 09:54 ?771次閱讀
    如何<b class='flag-5'>寫(xiě)</b>一個(gè)簡(jiǎn)單的<b class='flag-5'>裝飾</b><b class='flag-5'>器</b>

    選擇精科睿進(jìn)行 PCBA 代工代料有以下十大理由

    選擇精科睿進(jìn)行 PCBA 代工代料有以下十大理由
    的頭像 發(fā)表于 11-06 10:21 ?512次閱讀
    主站蜘蛛池模板: 狠狠色丁香婷婷第六色孕妇 | 成片一卡三卡四卡免费网站 | 高清成年美女xx免费网站黄 | 黄色特级毛片 | 国产精品嫩草影院人体模特 | 日本在线一区二区 | 日本黄色小视频 | 久久国产免费福利永久 | 色爱区综合激情五月综合激情 | 日本黄页在线观看 | 白嫩少妇激情无码 | 久久国产免费福利永久 | 天天干天天操天天插 | 香蕉午夜视频 | 国产汉服被啪福利在线观看 | 婷婷五月五 | 午夜视频在线观看免费高清 | 精品久久久久久中文字幕欧美 | 狠狠色丁香婷婷综合久久片 | 久久国产精品永久免费网站 | 亚洲 成人 欧美 自拍 | 午夜影视福利 | 国产欧美综合在线 | 宅男666在线永久免费观看 | 欧日韩视频777888 | 特级毛片aaaa级毛片免费 | 天天免费| 在线播放真实国产乱子伦 | 永久黄色免费网站 | 播五月综合 | 国产大乳美女挤奶视频 | 97人人射| 老师受不了了好硬好大 | 美女网站黄在线看 | 黄色爱爱视频 | 毛片免| 在线视频91 | 黄网站色在线视频免费观看 | 国产精品理论片在线观看 | 天天操天天谢 | 亚洲黄色小视频 |