Decoratori in Python

5

Sto solo imparando Python, e attualmente sto giocando con il framework Tornado. Vedo questa classe:

class AuthHandler(BaseHandler, tornado.auth.GoogleMixin):
    @tornado.web.asynchronous
    def get(self):
        if self.get_argument("openid.mode", None):
            self.get_authenticated_user(self.async_callback(self._on_auth))
            return
        self.authenticate_redirect()

Ho difficoltà ad afferrare ciò che fa il decoratore (@ tornado.web.asincrono). Sovrascrive quella funzione?

Puoi vedere l'intera fonte all'indirizzo link

    
posta Clint 26.07.2012 - 09:35
fonte

2 risposte

5

Sì, probabilmente lo fa, ma probabilmente mantiene un riferimento alla definizione get(self) originale.

I decoratori Python non sono altro che un oggetto chiamabile (una funzione o un'istanza di classe con un metodo __call__ ). Qualsiasi che callable restituisce viene utilizzato come definizione per la funzione decorata.

Se definisco un semplice decoratore no-op come questo, ciò significa che sostituisco l'originale con .... l'originale:

def noopDecorator(func):
    return func

Il simbolo @ utilizzato per i decoratori è zucchero sintattico, puoi anche scriverlo come:

class AuthHandler(BaseHandler, tornado.auth.GoogleMixin):
    def get(self):
        if self.get_argument("openid.mode", None):
            self.get_authenticated_user(self.async_callback(self._on_auth))
            return
        self.authenticate_redirect()
    get = tornado.web.asynchronous(get)

Nel caso del tornado asynchronous decorator, il decoratore probabilmente restituisce un gestore differito, per gestire la funzione decorata in modo asincrono, mantenendo te, il programmatore di un'applicazione basata su tornado, dal dover ricordare la complessità di come fallo più e più volte In breve, ti concentriamo invece sui dettagli della tua applicazione.

    
risposta data 26.07.2012 - 09:52
fonte
0

Puoi vedere la documentazione di @tornado.web.asynchronous può essere trovata qui link .

In pratica, significa che il metodo verrà eseguito in modo asincrono, se possibile.

    
risposta data 26.07.2012 - 09:52
fonte

Leggi altre domande sui tag