5個理由告訴你為什麼要學習使用Python裝飾器
Python 裝飾器使用非常地簡單。任何會使用 Python 函式的人都可以學習使用裝飾器:
Python123 | @somedecoratordefsome_function():print("Check it out, I'm using decorators!") |
但是如何寫裝飾器卻是另外一回事,而且這並不容易。你必須明白如下這些內容:
- 閉包
- 如何將函式做為一階引數
- 變數引數
- 引數解包
- 甚至是一些 Python 載入原始碼的細節
這些知識都需要花費大量的時間去理解掌握。如果你已經累積了許多其它需要學習的內容。這些內容還值得你去學習嗎?
對於我來說,答案是肯定的。希望你的答案也是肯定的。那麼,自己寫裝飾器的好處是什麼呢?或者說,它們會讓我在日常開發過程中哪些事變得容易?
分析、日誌與手段
對於大型應用, 我們常常需要記錄應用的狀態,以及測量不同活動的數量。通過將這些特別的事件包裝到函式或方法中,裝飾器可以很輕鬆地滿足這些需求,同時保證程式碼的可讀性。
12345678910111213 | frommyapp.log importloggerdeflog_order_event(func):defwrapper(*args,**kwargs):logger.info("Ordering: %s",func.__name__)order=func(*args,**kwargs)logger.debug("Order result: %s",order.result)returnorderreturnwrapper@log_order_eventdeforder_pizza(*toppings):# let's get some pizza! |
這個方法也可以用來記數或者記錄其它某些指標。
驗證以及執行時檢查
Python 是一種強型別語言,但是變數的型別卻是動態變化的。雖然這會帶來很多好處,但是同時這也意味著更容易引入 bug。對於靜態語言,例如 Java, 這些 bug 在編譯階段就可以被發現。因而,你可能希望在對傳入或返回的資料進行一些自定義的的檢查。裝飾器就可以讓你非常容易地實現這個需求,並一次性將其應用到多個函式上。
想像一下:你有許多函式,每個函式返回一個字典型別,該字典包含一個“summary ”域。這個域的值不能超過 80 個字元的長度。如果違反這個要求,那就是一個錯誤。下面這個裝飾器會在錯誤發生時丟擲 ValueError 異常:
Python12345678910111213141516171819 | defvalidate_summary(func):defwrapper(*args,**kwargs):data=func(*args,**kwargs)iflen(data["summary"])>80:raiseValueError("Summary too long")returndatareturnwrapper@validate_summarydeffetch_customer_data():# ...@validate_summarydefquery_orders(criteria):# ...@validate_summarydefcreate_invoice(params):# ... |
建立框架
一旦你掌握瞭如何寫裝飾器,你就能夠從其使用的簡單的語法中獲益頗豐,你可以為語言新增新的語義使其使用更加簡單。接下來最棒的就是你可以自己擴充套件 Python 語法。
事實上,很多開源框架都是使用的這樣的方式。 Web 應用框架 Flask 就是使用裝飾器將不同 URL 路由到不同處理 HTTP 請求函式的:
Python12345678910111213141516171819202122 | # For a RESTful todo-list API.@app.route("/tasks/",methods=["GET"])defget_all_tasks():tasks=app.store.get_all_tasks()returnmake_response(json.dumps(tasks),200)@app.route("/tasks/",methods=["POST"])defcreate_task():payload=request.get_json(force=True)task_id=app.store.create_task(summary=payload["summary"],description=payload["description"],)task_info={"id":task_id}returnmake_response(json.dumps(task_info),201)@app.route("/tasks/<int:task_id>/")deftask_details(task_id):task_info=app.store.task_details(task_id)iftask_info isNone:returnmake_response("",404)returnjson.dumps(task_info) |
這裡有一個全域性物件 app,此物件有一個 route 方法。此 route 函式返回一個用於修飾請求處理函式的裝飾器。這背後的處理是非常複雜的,但是對於使用 Flask 的程式設計師來說,所有複雜的東西都被隱藏起來了。
在平時使用 Python 過程中,我們也會這樣使用裝飾器。例如,所有的物件都依賴於類方法與屬性裝飾器:
Python12345678910111213 | classWeatherSimulation:def__init__(self,**params):self.params=params@classmethoddeffor_winter(cls,**other_params):params={'month':'Jan','temp':'0'}params.update(other_params)returncls(**params)@propertydefprogress(self):returnself.completed_iterations()/self.total_iterations() |
這個類有三個不同的 def 語句,但是每一個的語義都是不同的:
- 構造器是一個簡單的方法
- for_winter 是一個類方法
- progress 是一個只讀的動態屬性
@classmethod 裝飾器與 @property 裝飾器可以讓我們在平時使用過程中非常方便地擴充套件 Python 物件的語義。
複用不能複用的程式碼
Python 提供了非常強大的工具以將程式碼包裝成易複用的形式,這些工具包括:函式、函數語言程式設計的支援以及一切皆物件的思想。然而,還是存在某些程式碼並不能通過使用這些工具進行復用。
假設有一個古怪的 API。你可以通過 HTTP 傳送 JSON 格式的請求,它 99.9% 的情況下都是正確工作的。但是,小部分請求會返回伺服器內部錯誤的結果。這時候,你需要重新發送請求。在這種情況下,你需要實現重試邏輯,像這樣:
Python12345678 | resp=NonewhileTrue:resp=make_api_call()ifresp.status_code==500andtries<MAX_TRIES:tries+=1continuebreakprocess_response(resp) |
現在假設你的程式碼庫中有很都地方都進行呼叫了函式 make_api_call,那麼是不是需要在每個呼叫的地方都實現這個 loop 迴圈呢?是不是每次新增一次呼叫都要實現一遍這個迴圈呢?這種模式能難有一個樣板程式碼,除非你使用裝飾器,那麼這就變得非常簡單了:
Python12345678910111213141516171819202122 | # The decorated function returns a Response object,# which has a status_code attribute. 200 means# success; 500 indicates a server-side error.defretry(func):defretried_func(*args,**kwargs):MAX_TRIES=3tries=0whileTrue:resp=func(*args,**kwargs)ifresp.status_code==500andtries<MAX_TRIES:tries+=1continuebreakreturnrespreturnretried_funcThis gives you an easy-to-use@retry decorator:@retrydefmake_api_call():# .... |
讓你的事業騰飛
剛開始寫裝飾器時可能不是那麼容易。雖然這並不像造火箭那麼難,但你也需要花費一些時間去學習,掌握其中的奧祕。大部分程式都能夠掌握。當你成為團隊裡面能把裝飾器寫得很好並且能解決真正的問題的人時,此時其它開發者都會使用你開發的這些裝飾器。因為一旦最難的部分,也就是實現裝飾器完成後,使用裝飾器是非常容易的。這可以極大的放大你所寫程式碼的正面影響,這會讓你成為團隊的英雄。
我已經培訓了成百上千的軟體工程師讓他們更高效地使用 Python,這些團隊一致的反映裝飾器是這其中最有價值也是他們在 Python 高階程式設計中使用的最重要的工具。這也是為什麼其成為了接下來的 Python 課程重點:在 2016 年 5月 25日與 26 日基礎線上課程之後。
不管你是以何種方式學習實現裝飾器,你都會因其能完成的工作而感到興奮。毫無疑問,它能永久地改變你使用 Python 的方式 。
相關推薦
5個理由告訴你為什麼要學習使用Python裝飾器
Python 裝飾器使用非常地簡單。任何會使用 Python 函式的人都可以學習使用裝飾器: Python @somedecorator def some_function(): print("Check i
事到如今,10個理由讓你不得不學習python!
從那以後一切都變了很多。2016年,Python取代了Java,成為大學裡最流行的語言,從那時起,它就再也沒有回頭看過了。 Python在成長,成長的時間越來越長。如果您閱讀程式設計和技術新聞或部落格文章,您可能已經注意到Python的興起,因為許多流行的開發人員社群,包括StackOverfl
10個理由告訴你為何要學Java程式設計?
為什麼要學習Java程式語言?這個只要學習Java的小夥伴都會有答案,比如它的易學、面向物件,開源工具和庫等。在Java中獲得經驗可以確保有一個收入豐厚的工作崗位。有一長串的程式語言仍然存在它們的優點和缺點,使我們的生活更容易。在過去的20年裡,Java已經證明了它是最有效的程式語言之一。 隨著
5個理由讓你選擇Go,拋棄Python
任何人,對程式語言是如何工作(解釋型vs編譯型,動態語言vs靜態語言)有一點理解的話,會說,“切,當然Go語言會更快”。是的,我們也可以用java把所有的東西重寫一遍,也能看到類似更快的改善,但那不是Go語言勝出的原因。你用Go寫的程式碼好像就是對的。我搞不清楚到底是怎麼回事,但是一旦程式碼被編譯了(編譯
三個理由告訴你,企業為什麽需要大數據
回來 什麽 失去 不同的 海量數據 如果 發現 分享 高達 隨著科技進步、社會發展,尤其是以計算機為代表的信息技術飛速發展,各種信息呈爆炸式增長,數據滲透到各行各業,很多企業也越來越重視數據的收集與分析,以三大運營商、阿裏雲、景安網絡為代表的高新技術企業紛紛為客戶建立起專業
5個方法告訴你,如何提高面試通過率
今天,解優君來和大家分享一下,如何提高面試通過率,看能否給到你一些啟發。 面試的時候,我們在考察什麼 按照結構化面試的邏輯,一個完整的面試考察應該包括三個部分: 1、崗位勝任能力的考察 包括知識、技能以及核心勝任力的考察,拿一個HR的崗位來舉例: 所需知識:人力資源基礎知識、勞動法律法規
引流哥是如何做到一天引流十萬粉絲的?五個理由告訴你
ado 理由 責任感 一個 .com 上進 blog water 千萬 引流哥是如何做到一天引流十萬粉絲的? 從小白到現在擁有一千萬粉絲他是如何做到的? 源源不斷的粉絲自動加過來,是怎麽做到的? 一,信任感, 二,售後快 三,責任感 四,效率快 五,有效果 客戶覺得引流哥有
20181003:學習python裝飾器(確實有點繞)
讓我明白為什麼要用裝飾器的文章:https://www.jb51.net/article/99585.htm 下面的程式碼是裝飾器的原型。 最後20行的新foo最終成為包裹了第4行老foo函式的wrapper的內容,只是名字還是foo,其實和第4行的老foo完全不是同一個函式,第4行的老foo被實際包裹在這個
你應該學習python的7個理由
最好 cos 至少 erl cti 做到 想要 為什麽 linux Python 是一門更註重可讀性和效率的語言,尤其是相較於 Java,PHP 以及 C++ 這樣的語言,它的這兩個優勢讓其在開發者中大受歡迎。誠然,它有點老了,但仍是80後啊 —— 至少沒有 Cobol 或
你該學習 Python 的 7 個理由
存在 python 模塊 應該 開放 str macos 擁有 自己 教授 Python是一門更註重可讀性和效率的語言,尤其是相較於Java,PHP 以及 C++ 這樣的語言,它的這兩個優勢讓其在開發者中大受歡迎。誠然,它有點老了,但仍是80後啊 —— 至少沒有 Cobol
為什麼要學習Python?這10個理由足夠了!
如果你定期關注現今的科技發展,那麼你可能想知道我為什麼要寫這篇文章告訴人們學習Python?因為幾年前我提倡Java而不是Python。 在2016年,Python取代Java成為高校中最受歡迎的語言,從那時起它受歡迎的程度就沒有減退過。 但是,隨著新時代的到來,Python正在不斷髮展壯大。如果你
12月14日雲棲精選夜讀 | 為什麼要學習Python?這10個理由足夠了!
如果你定期關注現今的科技發展,那麼你可能想知道我為什麼要寫這篇文章告訴人們學習Python?因為幾年前我提倡Java而不是Python。 在2016年,Python取代Java成為高校中最受歡迎的語言,從那時起它受歡迎的程度就沒有減退過。 熱點熱議 為什麼要學習Python?這10個理由足夠了! 作
為什麼要學習Python,以下四個理由讓人心動!
Python是一門計算機程式語言,目前人工智慧科學領域應用廣泛,應用廣泛就表明各種庫,各種相關聯的框架都是以Python作為主要語言開發出來的。谷歌的TensorFlow大部分程式碼都是Python,其他語言一般只有幾千行。如果講開發效率,用Python,誰會用Java這種高不成低不就的語言搞人工智
你必須學會寫Python裝飾器的五個理由
你必須學寫Python裝飾器的五個理由 ----裝飾器能對你所寫的程式碼產生極大的正面作用 Python裝飾器是很容易使用的。任何一個會寫Python函式的人都能夠學會使用裝飾器,比如下面這個: @somedecorator def some_function(): pri
50k大牛告訴你Python怎麼學,10個特性帶你快速瞭解python
前言 如果你是一個正在學習python的c、c++ or java程式設計師,又或者你是剛剛接觸python,剛剛開始學習python,那麼,請認真看完這10個語言特性,你會受益匪淺的。 新增小編python學習群865597862即可領取2018最新全套python零基礎入門
深度學習引數怎麼調優,這12個trick告訴你
1:優化器。機器學習訓練的目的在於更新引數,優化目標函式,常見優化器有SGD,Adagrad,Adadelta,Adam,Adamax,Nadam。其中SGD和Adam優化器是最為常用的兩種優化器,SGD根據每個batch的資料計算一次區域性的估計,最小化代價函式。 學習速率決定了每次步進的大小
專家告訴你,為什麼Python是機器學習的首選語言
前言 對於機器學習領域的開發人員來說,Python是最流行的程式語言之一。Python既不是最快的語言(很容易被C和C+取代),也不一定是最容易學習的語言(R和Matlab可以有更小的學習曲線)。那麼,為什麼python被 57%的資料科學家和機器學習開發人員
告訴你要小心了呀!—Python中的安全坑
作為一門簡單易學,且能快速進階,以用來開發較為龐大和複雜的應用程式的程式語言,Python在計算環境中正在被廣泛應用。但是,它分外簡潔和友好的語言風格也可能讓軟體工程師和系統管理者們放鬆警惕——一不小心就會出現程式碼錯誤,而這些錯誤可能會引起嚴重的安全後果。
想要學習python,你應該知道的內容是啥?
ray mark 技術 程序 智能 四種 領域 ofo 第一個 Python具有豐富和強大的庫。它常被昵稱為膠水語言,能夠把用其他語言制作的各種模塊(尤其是C/C++)很輕松地聯結在一起。在學習Python之前,我們應該知道這些內容: 它是一種面向對象的解釋型計算機程序設計
為什麽要學習python?
python 領域 1. Python是什麽?2. 為什麽要選擇Python而不是其他的語言?3. 學習Python難嗎?小白能學會Python編程嗎?4. Python應用的領域和能解決的問題有哪些?本文出自 “周哥培訓” 博客,請務必保留此出處http://zhouge.blog.51cto