Decoradores em Python

5

Estou apenas aprendendo python e atualmente estou jogando com o framework Tornado. Eu vejo essa 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()

Estou tendo problemas em entender o que o decorador faz lá (@ tornado.web.asynchronous). Substitui essa função?

Você pode ver a fonte completa no link

    
por Clint 26.07.2012 / 09:35
fonte

2 respostas

5

Sim, provavelmente, mas provavelmente mantém uma referência à definição original get(self) .

Os decoradores de Python são nada mais do que uma chamada (uma função ou uma instância de classe com um método __call__ ). Seja o que for que retornos retornáveis é usado como a definição para a função decorada.

Se eu definir um simples decorador não operacional como esse, isso significa que eu substituo o original por .... o original:

def noopDecorator(func):
    return func

O símbolo @ usado para decoradores é o açúcar sintático, você também pode escrevê-lo como:

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)

No caso do tornado asynchronous decorator, o decorador provavelmente retorna um manipulador adiado, para manipular a função decorada de forma assíncrona, evitando que você, o programador de um aplicativo baseado em tornado, tenha que se lembrar das complexidades de como faça isso uma e outra vez. Em suma, permite que você se concentre nos detalhes do seu aplicativo.

    
por 26.07.2012 / 09:52
fonte
0

Você pode ver que a documentação de @tornado.web.asynchronous pode ser encontrada aqui link .

Mas basicamente isso significa que o método será executado de forma assíncrona, se possível.

    
por 26.07.2012 / 09:52
fonte

Tags