精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

讓你學寫Python裝飾器的五大理由

馬哥Linux運維 ? 來源:xx ? 2019-03-02 10:06 ? 次閱讀

你必須學寫Python裝飾器的五個理由

----裝飾器能對你所寫的代碼產生極大的正面作用

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

Python裝飾器是很容易使用的。任何一個會寫Python函數的人都能夠學會使用裝飾器,比如下面這個:\

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

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

閉包

如何將函數作為"第一類"參數來使用

變量參數

參數解包

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

所有這些都需要花很多時間去理解和掌握。而且當你已經有這么一堆事情要學的時候,這些值得你花時間嗎?

對我來說,這個問題的答案已然是上千次的“肯定,是的,我會學習!”

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

分析、日志以及指導

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

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!

同樣的方式可以被用來計數或者其他指標。

驗證與運行檢查

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

假設:你有一堆函數,每個函數都返回一個字典,這個字典包含一個稱作“summary”的字段。這個字段的值不能超過80個字符長度;如果違反了,就是不對的。這里給出一個裝飾器,當條件不滿足的時候它能夠拋出一個值錯誤(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)建框架

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

實際中,很多流行的開源框架都在使用裝飾器。網頁應用框架Flask就使用了裝飾器將URLs的路由交給那些處理HTTPS請求的函數。

# 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)

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

以這樣的方式使用裝飾器在stock Python中也有體現。舉個例子,完全使用對象系統(tǒng)是有賴于@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()

這個類有3個不同的定義聲明。但是,他們的語意是各不相同的。

1:constructor是一個正常方法

2:for_winter是一個類方法且提供一種類似于“車間”的東西

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

對于日常來說,@classmethod和@property兩個裝飾器如此簡單以致可以很容易擴展Python的對象語意

復用那些不可能復用的代碼

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

比如使用一個不可靠的API。你給那些通過HTTP對話的JSON發(fā)出一些請求的時候,API可以99.9%的時候工作正常。但是,有一小部分請求將使得服務器返回一個內部錯誤,然后你需要重試這些請求。在這個情況下,你將寫一個重試邏輯,比如:

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

現在,假設你有十多個類似于make_api_call的函數,并且他們被所有代碼調用。那么你是想要每次調用它們的時候寫一個while循環(huán)呢?還是每次增加一個API調用函數的時候都把這段代碼再寫一遍?無論哪種選擇都會產生大量的重復代碼,除非你用裝飾器。用了裝飾器事情就簡單了。

# 加了裝飾器的函數會返回一個Response對象,# 這個對象有個一二status_code的屬性,# 200表示成功;500表示服務器錯誤。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è)生涯

編寫裝飾器在一開始并不容易。它雖然不像火箭科學但是也需要你花很多努力去學習,去排除一些細微差異。很多開發(fā)者也從來不會通過這些麻煩而學習掌握裝飾器編寫。但是學習裝飾器的確會給你優(yōu)勢。當你是你的團隊里面學習如何寫好裝飾器的那個人的時候,并且你寫的裝飾器能解決一些實際問題的時候,其他開發(fā)者將會使用你的裝飾器。因為,一旦這些裝飾器編寫的困難的部分被完成了,裝飾器就會很容易使用。這就對你所寫的代碼產生極大的正面作用。這也會讓你成為一個重要角色。

不論你如何編寫裝飾器,你會對下面你所要做的事情而感到興奮,比如你即將能使用裝飾器來做一些事情,以及裝飾器是如何能永遠改變你寫Python代碼的方式。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • python
    +關注

    關注

    56

    文章

    4782

    瀏覽量

    84453

原文標題:你必須學寫 Python 裝飾器的五個理由

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    亞馬遜為何收購通訊公司Slack 有以下五大理由

    若干家潛在收購方的目標,它們對Slack開出的報價可能達到90億美元。在這些收購方當中,就包括了亞馬遜。亞馬遜為何會收購Slack,國外媒體列舉出了五大理由
    發(fā)表于 06-17 06:00 ?902次閱讀

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

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

    德州儀器轉向微型器件的五大理由

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

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

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

    3D立體電視勢不可擋的7大疑問和4大理由

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

    由Windows 2000升級至2003/XP的10大理由

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

    愛上蘋果機的6大理由

    愛上蘋果機的6大理由 1. 蘋果不需要殺毒軟件. 其實殺毒軟件也是病毒.-殺毒軟件的電腦變慢. 并且它跟病毒一樣時時刻刻
    發(fā)表于 02-26 16:55 ?748次閱讀

    使用LabVIEW軟件進行數據采集和信號處理的10大理由

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

    大理由:XTREMIO 應用于數據庫

    大理由:XTREMIO 應用于數據庫
    發(fā)表于 12-25 00:25 ?0次下載

    Fibridge-DVP 代替 DVR的七大理由

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

    關注C-RAN的五大理由

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

    自動焊接機器人的五大購買理由

    為什么購買自動焊接機器人?在科學技術飛速發(fā)展的當今社會,企業(yè)需要順應時代發(fā)展的步伐,提高自身的自動化水平來實現轉型升級,自動焊接機器人在焊接行業(yè)中的應用越來越廣泛,逐漸代替了傳統(tǒng)手動焊接,小編總結了自動焊接機器人購買的五大理由,我們一起往下看。
    發(fā)表于 01-15 15:54 ?633次閱讀

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

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

    如何一個簡單的裝飾

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

    選擇精科睿進行 PCBA 代工代料有以下十大理由

    選擇精科睿進行 PCBA 代工代料有以下十大理由
    的頭像 發(fā)表于 11-06 10:21 ?135次閱讀