15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

O módulo app pode agora ser o mesmo do exemplo original. Ele importa dialog

no topo e chama dialog.show no fim do arquivo.

# app.py

import dialog

class Prefs(object):

# ...

prefs = Prefs()

dialog.show()

O efeito disso é semelhante ao da técnica importar, configurar e executar

mostrada antes. A diferença está em não precisar de alterações estruturais na

maneira com que os módulos são definidos e importados. Estamos,

simplesmente, postergando a importação circular até o momento em que o

acesso ao outro módulo seja estritamente necessário. Nesse ponto, temos certeza

de que todos os outros módulos já foram inicializados (passo 5 foi finalizado

para todo mundo).

No geral, recomenda-se evitar importações dinâmicas como essas. O custo do

comando import não pode ser desprezado e é especialmente pernicioso em laços

de repetição. Ao postergar a execução, as importações dinâmicas também

contribuem para uma surpreendente taxa de falhas durante a execução, como

exceções SyntaxError que aparecem muito tempo depois de o programa já estar

em execução e uso (consulte o Item 56: “Teste absolutamente tudo com unittest”

para descobrir uma maneira de evitar o problema). Entretanto, as desvantagens

são normalmente menos traumáticas que a perspectiva de reestruturar

completamente o programa.

Lembre-se

• As dependências circulares acontecem quando dois módulos precisam

chamar um ao outro no momento da importação. Quando isso acontece,

normalmente o programa trava.

• A melhor maneira de desmantelar uma dependência circular é refatorar as

dependências mútuas em um módulo separado e colocar esse módulo no final

da árvore de dependências.

• As importações dinâmicas são a solução mais simples para resolver uma

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!