← as aulas · Núcleo de Segurança Neon · aula 02

O arquivo que rodava sozinho

Um import em qualquer lugar do projeto já abria uma conexão com o banco. Ninguém tinha pedido.

começar

a receita, igual em toda aula

1 · o erro

O código errado, como quase todo mundo faz.

2 · o porquê

Por que aquilo é perigoso, em português.

3 · a correção

O código certo.

4 · a prova

O terminal respondendo.

02 Tudo solto no corpo do arquivo

o que roda no import

1 · o erro

A primeira versão do arquivo, salva antes da revisão. Repare que não existe nenhuma função: tudo está no corpo, colado na margem esquerda.

import os
import psycopg2
from neon_config import carregar_env

# Garante o carregamento do .env
carregar_env()

print("Iniciando o Núcleo de Segurança Neon...")

conexao = None

try:
    host = os.environ.get("NEON_DB_HOST", "127.0.0.1")
2 · o porquê

Em Python, importar um arquivo é executar o arquivo. Não existe "só carregar as funções": o interpretador lê de cima a baixo e faz o que estiver escrito.

Então no dia em que outro arquivo do projeto escrevesse:

import neon_core

...ele levaria junto, sem pedir e sem avisar: o .env lido, uma frase impressa na tela e uma conexão aberta com o banco de dados.

Um teste automatizado que importasse o módulo abriria conexão. Um script de build, idem. E o dia em que o banco estivesse fora do ar, o import quebraria — um import, não uma chamada.

A regra: código no corpo do arquivo roda no import. Código dentro de função roda quando alguém chama. A diferença só aparece no dia do acidente, e aí já é tarde.

3 · a correção

Tudo que faz alguma coisa entrou numa função com nome e com docstring dizendo o que ela devolve:

def testar_conexao() -> bool:
    """Abre, valida e fecha uma conexão. True se o banco respondeu."""
    try:
        import psycopg2
    except ImportError:
        print("[ BLOQUEIO ] psycopg2 não instalado. Rode: pip install -r requirements.txt")
        return False

Repare que até o import psycopg2 desceu para dentro da função. Assim quem só quer ler uma constante do módulo não precisa ter a biblioteca do Postgres instalada.

E a fechadura fica fechada de verdade, com o finally:

    finally:
        if conexao is not None:
            conexao.close()
            print("[ INFO ] Conexão encerrada com segurança.")

Por fim, as duas linhas no fim do arquivo que separam rodar de importar — as mais importantes da aula:

if __name__ == "__main__":
    print("Iniciando o Núcleo de Segurança Neon...")
    sys.exit(0 if testar_conexao() else 1)

__name__ vale "__main__" quando você chamou o arquivo pelo terminal, e vale o nome do módulo quando alguém importou. Uma linha, e o arquivo passa a saber a diferença.

4 · a prova

A saída do arquivo antigo, com tudo solto — ele tenta conectar assim que é lido, e falha em público:

$ python3 neon_core.py
Iniciando o Núcleo de Segurança Neon...
[ BLOQUEIO ] Falha na invasão autorizada: connection to server at "127.0.0.1",
port 5432 failed: fe_sendauth: no password supplied

E o antes e o depois lado a lado, feito pelo próprio Git:

diff -u original_ia/neon_core.py neon_core.py

Guardar a primeira geração do código numa pasta original_ia/ antes de revisar é o que torna esta aula possível. O erro tem endereço.

antes · original_ia/neon_core.py linhas 1–13  →  agora · neon_core.py — a saída é da captura de 4 de setembro de 2026, 10:08

para levar

Importar é executar. Se o arquivo faz alguma coisa quando é lido, ele vai fazer essa coisa no pior momento possível — no meio de um teste, de um build, ou de um dia em que o banco caiu.

Núcleo de Segurança Neon · aula 02 de 6 · todo código desta página foi copiado de um arquivo real do projeto — nenhum exemplo foi inventado