|
|
@ -776,7 +776,71 @@ Julio |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
<section> |
|
|
|
|
|
|
|
<p>A idéia dos decorators é cria uma função que altera a funcionalidade |
|
|
|
|
|
|
|
de uma função.</p> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>A forma mais simples de entender decorators é pensar neles como |
|
|
|
|
|
|
|
funções que encapsulam callbacks.</p> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
|
|
|
>>> def retrieve(connection): |
|
|
|
|
|
|
|
>>> # faz algo com a conexão para recuperar dados. |
|
|
|
|
|
|
|
</code></pre></p> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>Problema: antes de sair executando algo na conexão, tem que ser |
|
|
|
|
|
|
|
verificado se a conexão está ativa.</p> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
|
|
|
<p>Solução menos óbvia: Criar uma função que verifica a conexão e, |
|
|
|
|
|
|
|
se ela estiver ok, chama a função.</p> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
|
|
|
>>> 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) |
|
|
|
|
|
|
|
</code></pre></p> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>Novo problema: Todo lugar onde antes era chamado <code>retrieve</code> |
|
|
|
|
|
|
|
agora precisa ser alterado para <code>check(connection, retrieve)</code> e |
|
|
|
|
|
|
|
todo lungar onde era chamado <code>update</code> precisa ser alterado para |
|
|
|
|
|
|
|
<code>check(connection, update)</code>.</p> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
|
|
|
<p>Solução mais simples: decorators.</p> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
|
|
|
>>> 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 |
|
|
|
|
|
|
|
</code></pre></p> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>Não precisa alterar nenhuma chamada de <code>retrieve</code>.</p> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section data-background='_images/thats-all-folks.jpg'> |
|
|
|
|
|
|
|
<section></section> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|