Trilha de aprendizado · Nível 5 · Tutorial 2

Controlar a execução de módulos com __name__

Fazer um arquivo funcionar tanto como programa executável quanto como módulo reutilizável, sem iniciar interações ou cálculos indevidos durante a importação.

  • Nível: Iniciante
  • Duração: 12 min
  • 6 passos
Controlar a execução de módulos com __name__

O que você vai percorrer

  1. Por que importar pode iniciar um programa? Preveja quais instruções de um módulo são executadas quando ele é importado pela primeira vez. 2 min
  2. O que muda ao importar novamente? Distinguir o reaproveitamento de um módulo no mesmo processo da primeira importação realizada em uma nova execução do Python. 1 min
  3. Dois modos de executar, dois valores de __name__ Associe o valor de __name__ ao papel de cada arquivo: iniciar o programa ou ser importado como módulo. 2 min
  4. Proteger o início com if __name__ Use uma condição para iniciar interações somente na execução direta, mantendo as definições disponíveis durante a importação. 2 min
  5. Deixar a coordenação em main Organize a conversão como recurso reutilizável e concentre a interação em uma função main chamada somente pela proteção. 2 min
  6. Aplicar e conferir nos dois modos Prática final para verificar a execução direta, a importação sem efeitos colaterais e a reutilização explícita de uma função. 3 min

O que você vai aprender

  • Prever quais instruções de nível superior serão executadas durante uma importação.
  • Comparar o valor de __name__ na execução direta e na importação.
  • Proteger a chamada da função coordenadora com if __name__ == "__main__".
  • Conferir manualmente que um módulo pode ser importado sem solicitar entradas nem apresentar resultados inesperados.

Antes de começar

  • Separar código em módulos e usar importações explícitas
  • Selecionar caminhos com if, elif e else
  • Decompor um programa em funções com responsabilidades claras

Passo 1 de 6

Por que importar pode iniciar um programa?

Preveja quais instruções de um módulo são executadas quando ele é importado pela primeira vez.

O que existe no nível superior?

Importar também executa instruções

Na primeira importação bem-sucedida de um módulo, o Python executa suas instruções de nível superior, de cima para baixo. Isso inclui atribuições, instruções def e chamadas escritas fora das funções.

Uma instrução def cria a função, mas não executa seu corpo. Já uma chamada no nível superior executa o corpo da função naquele momento.

Arquivo medidas.py

Observe o que está fora das funções e o que está dentro de cada corpo.

python
FATOR = 100


def metros_para_centimetros(metros):
    return metros * FATOR


def anunciar_carregamento():
    print("Módulo de medidas carregado")


anunciar_carregamento()

A importação antes da continuação

Mesmo ao importar apenas um nome

Considere outro arquivo que solicita somente metros_para_centimetros. A forma from medidas import metros_para_centimetros ainda precisa carregar e executar medidas.py. Ela não executa apenas a definição selecionada.

Arquivo usar_medidas.py

A mensagem deste arquivo só aparece depois que a execução necessária de medidas.py termina.

python
from medidas import metros_para_centimetros

print("Importação concluída")

Fluxo da primeira importação

O programa importador pausa enquanto o módulo é executado. Depois que o nome solicitado fica disponível, o importador continua.

Diagrama de fluxo no qual usar_medidas.py conduz a medidas.py; as definições são registradas, a chamada no nível superior produz uma saída e só depois usar_medidas.py continua.

Primeiro o módulo é carregado e executado; depois o programa importador segue para a próxima instrução.

Efeitos colaterais da importação

Atenção

Uma importação pode fazer mais do que disponibilizar nomes

Se houver chamadas de print(), input() ou de cálculos no nível superior, elas poderão apresentar resultados, solicitar uma entrada ou iniciar processamento durante a importação — mesmo que o arquivo importador não tenha pedido essas ações explicitamente.

Dica

Como prever o comportamento

Leia o módulo de cima para baixo. Para cada instrução no nível superior, pergunte: ela apenas atribui ou define um nome, ou chama algo? Corpos de funções definidas permanecem sem execução até que alguma chamada os alcance.

Preveja a saída

Primeira importação

Considerando os dois arquivos mostrados e a primeira importação bem-sucedida de medidas, o que aparece no terminal ao executar usar_medidas.py?

Passo 2 de 6

O que muda ao importar novamente?

Distinguir o reaproveitamento de um módulo no mesmo processo da primeira importação realizada em uma nova execução do Python.

Duas importações no mesmo processo

O módulo é reaproveitado

Depois que um módulo é importado com sucesso, uma nova importação pelo mesmo nome no mesmo processo normalmente reaproveita o módulo já carregado. Por isso, o código de nível superior não é executado outra vez. Isso não elimina efeitos colaterais: eles ainda acontecem na primeira importação.

Arquivo medidas.py

A chamada no nível superior apresenta uma mensagem quando o módulo é executado pela primeira vez no processo.

python
FATOR = 100


def metros_para_centimetros(metros):
    return metros * FATOR


def anunciar_carregamento():
    print("Módulo de medidas carregado")


anunciar_carregamento()

Arquivo usar_medidas.py

As duas instruções de importação pertencem ao mesmo script e, portanto, à mesma execução do Python.

python
import medidas
import medidas

print("Importações concluídas")

Mesmo processo ou nova execução?

Comparação entre os processos

No mesmo processo, somente a primeira importação alcança e executa o código de nível superior de medidas.py. Em processos separados, cada processo realiza sua própria primeira importação.

Diagrama em dois painéis. No primeiro, duas importações no mesmo processo apontam para uma única execução do módulo. No segundo, dois processos separados executam o módulo uma vez cada.

O reaproveitamento vale dentro do mesmo processo. Uma nova execução do Python começa sem esse módulo previamente carregado.

Exemplo

Saídas previstas

Ao executar usar_medidas.py, as duas importações estão no mesmo processo:

Módulo de medidas carregado
Importações concluídas

Se você encerrar essa execução e iniciar usar_medidas.py novamente, será criado outro processo. Nele, a primeira importação poderá executar novamente medidas.py, produzindo a mesma saída outra vez.

Confira sua previsão

Importação repetida no mesmo processo

Em uma única execução de usar_medidas.py, a mensagem Módulo de medidas carregado aparece duas vezes porque há duas instruções import medidas.

Primeiras importações em processos diferentes

Se usar_medidas.py for executado duas vezes, encerrando a primeira execução antes de iniciar a segunda, a mensagem do módulo poderá aparecer uma vez em cada execução.

Passo 3 de 6

Dois modos de executar, dois valores de __name__

Associe o valor de name ao papel de cada arquivo: iniciar o programa ou ser importado como módulo.

Uma variável definida pelo Python

Cada módulo recebe seu próprio __name__

Quando um arquivo Python é executado, o próprio Python define a variável __name__ no espaço de nomes desse módulo. O valor depende do papel desempenhado pelo arquivo: iniciar o programa ou ser carregado por uma importação.

medidas.py

Esta instrução de nível superior permite observar o valor atribuído pelo Python.

python
print(f"Em medidas.py: {__name__}")

O mesmo arquivo em dois contextos

Execução direta ou importação

Ao executar medidas.py diretamente, ele é o arquivo que inicia o programa e seu __name__ vale "__main__". Quando outro script importa esse arquivo como medidas, o valor dentro do módulo passa a ser "medidas", sem a extensão .py.

Comparação dos dois modos

Diagrama dividido: à esquerda, medidas.py executado diretamente recebe __name__ igual a __main__; à direita, usar_medidas.py inicia o programa e o módulo importado medidas.py recebe __name__ igual a medidas.

O contexto muda o valor: o arquivo inicial recebe __main__; o módulo importado recebe seu nome de importação.

Cada arquivo tem seu próprio valor

usar_medidas.py

Considere este script na mesma pasta de medidas.py. A importação executa a instrução de nível superior do módulo antes de o script continuar.

python
import medidas

print(f"Em usar_medidas.py: {__name__}")

Exemplo

Saída ao executar usar_medidas.py

Em medidas.py: medidas
Em usar_medidas.py: __main__

Os dois valores coexistem: medidas.py sabe que foi importado, enquanto usar_medidas.py sabe que iniciou o programa.

Dica

Observe de qual módulo vem o valor

__name__ não é um valor único compartilhado pelo programa inteiro. Cada módulo possui sua própria variável __name__.

Relacione contexto e valor

Qual saída pertence a cada contexto?

Associe cada situação ao valor observado no arquivo indicado.

Toque em um item e depois no par correspondente.

Passo 4 de 6

Proteger o início com if __name__

Use uma condição para iniciar interações somente na execução direta, mantendo as definições disponíveis durante a importação.

A proteção de execução

Uma condição para cada contexto

Como você já viu, __name__ vale "__main__" quando o próprio arquivo inicia o programa. Podemos usar esse valor em um if comum para proteger as instruções que iniciam interações ou cálculos.

As definições reutilizáveis permanecem fora do bloco. Assim, elas ficam disponíveis tanto na execução direta quanto na importação.

Interação protegida em medidas.py

A leitura e a apresentação do resultado estão indentadas dentro da condição.

python
def metros_para_centimetros(metros):
    return metros * 100


if __name__ == "__main__":
    metros = float(input("Metros: "))
    resultado = metros_para_centimetros(metros)
    print(f"Centímetros: {resultado}")

Dica

Observe a indentação

Somente as três instruções indentadas pertencem ao if. A função metros_para_centimetros continua definida no nível do módulo e pode ser importada.

Os dois caminhos da condição

Executar ou ignorar o bloco

Na execução direta, a comparação é verdadeira e o Python entra no bloco protegido. Durante a importação de medidas, a comparação é falsa: o bloco é ignorado, mas as definições anteriores continuam disponíveis para o programa importador.

Fluxo da proteção

Fluxograma em que a condição sobre __name__ leva a executar a interação na execução direta ou a ignorá-la durante a importação.

A proteção altera apenas o caminho seguido pelo bloco indentado.

O limite da proteção

Código fora do bloco ainda é executado

A condição não protege o arquivo inteiro. Uma chamada colocada no nível superior e fora do bloco continua sujeita à execução durante a importação.

Uma chamada dentro e outra fora

Compare a indentação das duas chamadas de print.

python
print("Módulo medidas carregado")


def metros_para_centimetros(metros):
    return metros * 100


if __name__ == "__main__":
    print("Programa iniciado diretamente")

Atenção

Importar ainda apresentará uma mensagem

Ao importar esse arquivo pela primeira vez, Módulo medidas carregado será apresentado porque essa chamada está fora da proteção. A segunda mensagem só aparece na execução direta.

Complete e preveja

Complete a proteção

Complete somente a condição:

if ____:

Preveja a primeira importação

Considere o código da tela anterior. O que aparece quando medidas é importado pela primeira vez?

Passo 5 de 6

Deixar a coordenação em main

Organize a conversão como recurso reutilizável e concentre a interação em uma função main chamada somente pela proteção.

Uma função para coordenar o programa

O papel de main

main é um nome convencional para a função que coordena o início do programa. Ela pode reunir a leitura da entrada, a chamada da conversão e a apresentação do resultado. main não é uma palavra reservada e não recebe comportamento automático do Python: defini-la apenas cria a função; é preciso chamá-la para executar seu corpo.

Estrutura de medidas.py

A conversão permanece disponível no nível do módulo. A função main coordena a interação, e somente sua chamada fica dentro da proteção.

python
def metros_para_centimetros(metros):
    return metros * 100


def main():
    valor = float(input("Metros: "))
    resultado = metros_para_centimetros(valor)
    print(f"{resultado} cm")


if __name__ == "__main__":
    main()

Dica

Definir não é iniciar

A definição de main fica fora da proteção para que o Python conheça a função antes de alcançar sua chamada. A interação só começa quando main() é chamada dentro do bloco protegido.

Da interação solta à coordenação

Uma proteção mais enxuta

Antes, as instruções de entrada, conversão e saída podiam ficar diretamente dentro do if. Agora, essas responsabilidades são coordenadas por main, enquanto a proteção contém apenas a chamada que inicia o programa. A função metros_para_centimetros continua separada e pode ser importada sem iniciar a interação.

Comparação da organização

Compare a concentração das responsabilidades nas duas estruturas.

Comparação estrutural: à esquerda, entrada, conversão e saída diretamente dentro da proteção; à direita, uma função reutilizável, uma função coordenadora e apenas a chamada de main dentro da proteção.

Na estrutura organizada, a proteção decide se o programa começa; main coordena a interação; e a conversão permanece reutilizável.

Organize os blocos essenciais

Monte o final de medidas.py

Ordene os três blocos. As duas definições foram agrupadas para representar uma estrutura inequívoca.

  1. def metros_para_centimetros(metros): return metros * 100 def main(): valor = float(input("Metros: ")) resultado = metros_para_centimetros(valor) print(f"{resultado} cm")
  2. main()
  3. if __name__ == "__main__":

Passo 6 de 6

Aplicar e conferir nos dois modos

Prática final para verificar a execução direta, a importação sem efeitos colaterais e a reutilização explícita de uma função.

Prepare os dois arquivos

Prática no seu computador

Crie medidas.py e usar_medidas.py na mesma pasta. Copie os códigos abaixo e salve os arquivos. A função de conversão ficará disponível nos dois modos, enquanto a chamada de main só iniciará a interação na execução direta.

medidas.py

A conversão é reutilizável, e a coordenação do programa fica em main.

python
def metros_para_centimetros(metros):
    return metros * 100


def main():
    valor = float(input("Metros: "))
    resultado = metros_para_centimetros(valor)
    print(f"{resultado} cm")


if __name__ == "__main__":
    main()

usar_medidas.py

Este script primeiro confirma que a importação terminou e depois chama intencionalmente a função reutilizável.

python
import medidas

print("Importação concluída")
resultado = medidas.metros_para_centimetros(2)
print(f"2 m correspondem a {resultado} cm")

Modo 1: execução direta

Inicie o programa interativo

Abra o terminal na pasta dos arquivos e execute o comando abaixo. Essa execução inicia um novo processo do Python. Quando aparecer Metros:, digite 1.5 e pressione Enter. Se o comando configurado no seu computador for py, use py medidas.py.

Comando

shell
python medidas.py

Exemplo

Saída esperada

Metros: 1.5
150.0 cm

A interação aconteceu porque, na execução direta de medidas.py, seu __name__ vale "__main__" e a chamada protegida de main() é alcançada.

Modo 2: importação e reutilização

Execute o script importador

Agora execute o outro arquivo com o comando abaixo. Essa verificação também começa em um novo processo, evitando que uma importação anterior já reaproveitada esconda o comportamento inicial do módulo. Se você usou py medidas.py, execute agora py usar_medidas.py.

Comparação dos dois modos

Na execução direta, o caminho alcança a interação coordenada por main. Na importação, a proteção desvia desse início e deixa a função de conversão disponível para uma chamada explícita.

Comparação lado a lado: a execução direta de medidas.py segue para uma interação no terminal, enquanto usar_medidas.py importa o módulo sem interação e chama somente a função de conversão.

Importar disponibiliza a função; executar diretamente também permite iniciar main.

Comando

shell
python usar_medidas.py

Exemplo

Saída esperada

Importação concluída
2 m correspondem a 200 cm

Não aparece Metros: nem um resultado produzido por main. A segunda linha é intencional: ela só existe porque usar_medidas.py chamou explicitamente medidas.metros_para_centimetros(2).

Revisão final

Registre suas evidências

Com base no que você observou no terminal, explique por que main() foi chamada na execução direta de medidas.py, mas não durante a importação feita por usar_medidas.py. Diferencie também o resultado intencional da conversão de um efeito colateral da importação.

Escreva pelo menos 80 caracteres (0/80).

Resumo

O mesmo arquivo em dois papéis

A proteção permite combinar um programa executável com um módulo reutilizável.

  • Na primeira importação, as instruções de nível superior são executadas, mas o bloco protegido é ignorado porque __name__ não vale "__main__".
  • Na execução direta, a condição é verdadeira e a chamada de main() inicia a interação.
  • Funções reutilizáveis permanecem fora da proteção e podem ser chamadas explicitamente pelo programa importador.
  • Após editar o módulo, iniciar um novo processo em cada verificação evita conclusões baseadas no reaproveitamento de uma importação anterior.
  • Uma importação segura disponibiliza recursos sem solicitar entradas nem apresentar resultados inesperados.

Tutorial concluído

Parabéns! Você concluiu: Controlar a execução de módulos com __name__

Você concluiu o tutorial! Agora sabe prever efeitos de uma importação, interpretar __name__ e proteger o início de um programa com if __name__ == "__main__".

100 XP

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso