日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python response重头开始_你必须学写 Python 装饰器的五个理由

發布時間:2025/3/15 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python response重头开始_你必须学写 Python 装饰器的五个理由 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

你必須學寫Python裝飾器的五個理由
----裝飾器能對你所寫的代碼產生極大的正面作用
作者:Aaron Maxwell,2016年5月5日

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

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

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

  • 閉包
  • 如何將函數作為"第一類"參數來使用
  • 變量參數
  • 參數解包
  • 甚至是Python是如何裝載源碼的一些細節

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

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

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

分析、日志以及指導

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

from myapp.log import loggerdef 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 orderreturn wrapper@log_order_eventdef order_pizza(*toppings):# let"s get some pizza!

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

驗證與運行檢查

Python的類型系統是相當類型化了的,但是也是很動態的。對于它的這些所有的好處,也意味著某一些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 datareturn wrapper@validate_summarydef fetch_customer_data():# ...@validate_summarydef query_orders(criteria):# ...@validate_summarydef create_invoice(params):# ...

創建框架

一旦你掌握了裝飾器的編程,你將能夠受益于使用裝飾器的簡單語法,而這讓你增加語意給你的代碼以便容易使用它。這就是下一個能夠擴展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/<int:task_id>/")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(路由)的方法并接受特定參數。這個路由方法返回一個被應用到處理函數的裝飾器。在這個“面罩”下發生了一些很錯綜復雜的的事情,但是從Flask的使用者角度看,所有這些復雜性是完全被隱藏起來的了。

以這樣的方式使用裝飾器在stock Python中也有體現。舉個例子,完全使用對象系統是有賴于@classmethod和@property裝飾器的:

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

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

1:constructor是一個正常方法

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

3:progess是只讀、動態屬性

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

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

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

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

resp = Nonewhile True:resp = make_api_call()if resp.status_code == 500 and tries < MAX_TRIES:tries += 1continuebreakprocess_response(resp)

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

# 加了裝飾器的函數會返回一個Response對象, # 這個對象有個一二status_code的屬性, # 200表示成功;500表示服務器錯誤。def retry(func):def retried_func(*args, **kwargs):MAX_TRIES = 3tries = 0while True:resp = func(*args, **kwargs)if resp.status_code == 500 and tries < MAX_TRIES:tries += 1continuebreakreturn respreturn retried_func

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

@retrydef make_api_call():# ....

提升你的職業生涯

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

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

英文原文:https://www.oreilly.com/ideas/5-reasons-you-need-to-learn-to-write-python-decorators
譯者:gvicky

總結

以上是生活随笔為你收集整理的python response重头开始_你必须学写 Python 装饰器的五个理由的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。