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

歡迎訪問 生活随笔!

生活随笔

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

python

Python 的装饰器执行顺序问题(二)

發布時間:2024/9/21 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 的装饰器执行顺序问题(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

一、問題分析

具體問題可見:Python 的裝飾器執行順序問題

原代碼如下:

def testwra(func):print "testwra"def _wrapper():print "wra"r = func()return rprint "end"return _wrapper@testwra @app.route('/users', methods=['GET']) def get_users():return ['33', '44']

直接執行,在輸入/users網址之前,便會輸出testwra和end,緊接著輸入網址之后,便會出現下面的錯誤:

分析錯誤原因,@testwra裝飾器在前面,@app.route裝飾器在后面,所以在輸入網址route之后執行的是沒被testwra裝飾的get_users,故而數據并沒有經過序列化處理,返回到頁面的仍然是list。再根據錯誤提示,返回值必須是字符串,元祖,響應實例,或者是可調用的WSGI,不能是list,所以出錯。

二、問題解決

在前輩幫助下,發現了問題所在,就是裝飾器的執行順序問題。

修改代碼如下(修改了裝飾器的順序,以及將list轉為json再輸出):

def testwra(func):print "testwra"def _wrapper():print "wra"r = func()return json.dumps(r)print "end"return _wrapper@app.route('/users', methods=['GET']) @testwra def get_users():return ['33', '44']

再次執行,在輸入/users網址之前,便會依次輸出testwra和end,緊接著輸入網址之后,便會輸出wra,然后在網頁上便能看到執行結果如下圖所示。

執行結果:

三、問題回顧

要想在輸入users之后,正常對['33', '44']進行序列化并進行顯示,應將@testwra裝飾器放在@app.route裝飾器之后才有效。這個時候輸入網址route到相應的處理函數時,get_users已經經過testwra序列化處理,所以便能夠正常顯示序列化后的["33", "44"]。

轉載于:https://my.oschina.net/u/3636678/blog/2209450

總結

以上是生活随笔為你收集整理的Python 的装饰器执行顺序问题(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

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