Python 中使用裝飾器對在運行期對函數進行一些外部功能的擴展。可是在使用過程當中,因爲裝飾器的加入致使解釋器認爲函數自己發生了改變,在某些狀況下——好比測試時——會致使一些問題。Python 經過 functool.wraps
爲咱們解決了這個問題:在編寫裝飾器時,在實現前加入 @functools.wraps(func)
能夠保證裝飾器不會對被裝飾函數形成影響。好比,在 Flask 中,咱們要本身重寫 login_required
裝飾器,但不想影響被裝飾器裝飾的方法,則 login_required
裝飾器自己能夠寫成下面的樣子:python
def login_required_(func): @wraps(func) def decorated_view(*args, **kwargs): if current_app.login_manager._login_disabled: return func(*args, **kwargs) elif not current_user.is_authenticated: # return current_app.login_manager.unauthorized() return redirect(url_for("login.loginPage", next=request.url)) return func(*args, **kwargs) return decorated_view