From 21f0b9d5242d950c827f364824969fcf0a26a06a Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Thu, 3 Jul 2014 12:57:08 -0300 Subject: [PATCH] done with python --- python.html | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/python.html b/python.html index fc37630..55e0991 100644 --- a/python.html +++ b/python.html @@ -776,8 +776,72 @@ Julio
+

A idéia dos decorators é cria uma função que altera a funcionalidade + de uma função.

+ +

A forma mais simples de entender decorators é pensar neles como + funções que encapsulam callbacks.

+
+ +
+


+>>> def retrieve(connection):
+>>>     # faz algo com a conexão para recuperar dados.
+				        

+ +

Problema: antes de sair executando algo na conexão, tem que ser + verificado se a conexão está ativa.

+
+ +
+

Solução menos óbvia: Criar uma função que verifica a conexão e, + se ela estiver ok, chama a função.

+ +


+>>> def retrieve(connection):
+>>>     # faz algo com a conexão para recuperar dados.
+>>>
+>>> def update(connection):
+>>>     # atualiza algo usando a função
+>>>
+>>> def check(connection, call):
+>>>     if not connection.is_connected:
+>>>         connection.retry()
+>>>     call(connection)
+				        

+ +

Novo problema: Todo lugar onde antes era chamado retrieve + agora precisa ser alterado para check(connection, retrieve) e + todo lungar onde era chamado update precisa ser alterado para + check(connection, update).

+
+ +
+

Solução mais simples: decorators.

+ +


+>>> from functools import wrap
+>>>
+>>> def check(func):
+>>>     def check_conn(*args, **kwargs):
+>>>         # acha a conexão em args ou kwargs
+>>>         if not connection.is_connected:
+>>>             connection.retry()
+>>>         return func(*args, **kwargs)
+>>>     return check_conn
+>>>
+>>> @check
+>>> def retrieve(connection):
+>>>     # faz algo com a conexão para recuperar dados
+						

+ +

Não precisa alterar nenhuma chamada de retrieve.

+ +
+
+