15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

import dialog

File "dialog.py", line 16, in <module>

save_dialog = Dialog(app.prefs.get('save_dir'))

AttributeError: 'module' object has no attribute 'prefs'

Para entender o que está acontecendo, é preciso conhecer os detalhes do

maquinário de importação do Python. Quando um módulo é importado, o que o

Python na verdade faz é, nesta ordem (e do elemento mais interno em direção ao

mais externo):

1. Procura por seu módulo nos locais determinados em sys.path.

2. Carrega o código do módulo e garante que ele seja compilado.

3. Cria um objeto de módulo correspondente que esteja vazio.

4. Insere o módulo em sys.modules.

5. Roda o código do objeto do módulo para definir seu conteúdo.

O problema com as dependências circulares é que os atributos de um módulo

não estão ainda definidos até que o código para esses atributos seja executado

(depois do passo 5). No entanto, o módulo pode ser carregado com o comando

import imediatamente antes de ser inserido em sys.modules (depois do passo 4).

No exemplo anterior, o módulo app importa dialog antes que qualquer coisa

tenha tido tempo de ser definida. Depois, o módulo dialog importa app. Como

app ainda não foi executado completamente, pois está esperando o fim da

importação de dialog, o módulo app é apenas uma casca vazia (criada no passo

4). A exceção AttributeError é elevada (durante o passo 5 de dialog) porque o

código que define prefs ainda não foi executado (o passo 5 de app ainda não está

completo).

A melhor solução para esse problema é refatorar o código para que a estrutura de

dados de prefs esteja no final da árvore de dependências. Assim, tanto app

quanto dialog podem importar o mesmo módulo auxiliar e evitar as

dependências circulares. Infelizmente, essa divisão de tarefas nem sempre é tão

clara ou possível, e numa situação extrema (mas bastante comum) pode até

mesmo requerer muito trabalho de refatoração para valer o esforço.

Há, contudo, outras maneiras de desmanchar dependências circulares.

Reordenação das importações

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!