Código no escopo global

Posted on 20 \d\e outubro \d\e 2009. Filed under: python | Tags:, , , , |

Todo mundo parece achar que colocar código diretamente no escopo superior (global) de um módulo python é legal. Eu não ligo, só peço que, se você fizer isso, não me faça usar o programa resultante. Mais especificamente, não me faça usar frameworks ou bibliotecas que cheguem a depender deste comportamento.

Afinal, tem um motivo pelo qual todo livro de Python que se preze, no primeiro capítulo, coloca uma cláusula desta forma:

if __name__ == '__main__':
   # do stuff

Isto permite a execução desta parte do módulo como um script, mas impede a execução caso o módulo seja importado por outro módulo. Todo script pode no futuro ser importado por outro módulo, e como o autor do módulo parece não querer que o código dentro do bloco “if” seja executado neste caso, faz sentido colocar tudo que não faz parte da inicialização do próprio módulo dentro de uma cláusula destas.

__name__ é uma variável definida automaticamente pelo interpretador, que recebe o valor '__main__' quando o script atual é o que foi iniciado no interpretador. Para scripts importados, __name__ é o nome de importação do script. Essa diferença permite escrever código que execute condicionado ao módulo ter sido importado ou executado.

Importar um módulo deve fazer no máximo estas coisas:

  • Importar outros módulos ou globais
  • Atribuir valores constantes a variáveis
  • Adicionar novas funções usando a cláusula def
  • Adicionar novas classes usando a cláusula class
  • Fluxo de controle que pode controlar partes condicionais do módulo para tratar erros ou versões específicas de certas plataformas para os casos acima.

Qualquer outro tipo de lógica executada direto no corpo de um módulo python (código que roda automaticamente durante imports) é tratado com suspeita e provavelmente está no lugar errado.

É um absurdo construir um sistema que se inicia ou se configura baseado em efeitos colaterais da importação de módulos. Você perde o controle de quando o código será executado. Ferramentas de inspeção automática de código, geração de documentação e de testes muitas vezes precisam importar o módulo para efetuar suas tarefas, e isto causa efeitos indesejados.

Anúncios
Ler Post Completo | Make a Comment ( None so far )

  • Blog Stats

    • 4,230 hits
  • contribua!

Liked it here?
Why not try sites on the blogroll...