Python 中實現裝飾器時使用 @functools.wraps 的理由

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
相關文章
相關標籤/搜索