Pular para o conteúdo

    Capítulo 25, Básico

    Módulos e importação

    Um módulo é um arquivo `.py`. Um pacote é uma pasta de módulos. É assim que o Python organiza código próprio e de terceiros.

    Código deste capítulo: basico/cap25_modulos.py

    Formas de importar

    basico/cap25_modulos.pylinhas 10 a 16
    import math
    from math import sqrt, pi
    import datetime as dt
    
    print(math.sqrt(16), sqrt(25))
    print(f"{pi:.4f}")
    print(math.floor(2.7), math.ceil(2.1), math.gcd(12, 18))
    
    Saída
    4.0 5.0
    3.1416
    2 3 6
    

    Eu prefiro import modulo e uso modulo.funcao, porque o leitor vê de onde vem cada nome. Evite from modulo import *: ele joga dezenas de nomes no seu código e torna impossível saber de onde cada um veio.

    A biblioteca padrão

    O Python vem com uma biblioteca padrão enorme, e conhecê-la evita instalar pacote para o que já existe:

    basico/cap25_modulos.pylinhas 21 a 29
    import statistics
    from datetime import date, timedelta
    
    notas = [7, 8, 9, 10]
    print(statistics.mean(notas), statistics.median(notas))
    hoje = date(2026, 10, 6)
    print(hoje.strftime("%d/%m/%Y"))
    print(hoje + timedelta(days=30))
    print((date(2026, 12, 25) - hoje).days)
    
    Saída
    8.5 8.5
    06/10/2026
    2026-11-05
    80
    
    basico/cap25_modulos.pylinhas 31 a 34
    import random
    
    print(random.randint(1, 6) in range(1, 7))
    print(random.choice(["a", "b", "c"]) in "abc")
    
    Saída
    True
    True
    

    O random serve para jogos e simulações. Para senhas e tokens, que precisam ser imprevisíveis de verdade, use o módulo secrets.

    Seus próprios módulos

    Qualquer arquivo .py vira um módulo importável. Veja um par de arquivos na pasta exemplos/modulos:

    exemplos/modulos/util.py
    """Funções de apoio importadas pelo programa principal."""
    
    
    def saudacao(nome: str) -> str:
        return f"Olá, {nome}!"
    
    
    if __name__ == "__main__":
        print(saudacao("teste do módulo"))
    
    exemplos/modulos/principal.py
    from util import saudacao
    
    print(saudacao("Ana"))
    
    Terminal
    python3 exemplos/modulos/principal.py
    

    Ao executar um script, o Python coloca a pasta do script no início da lista de busca de módulos, e é por isso que from util import saudacao funciona.

    O padrão if __name__ == "__main__"

    Todo módulo tem uma variável __name__. Quando o arquivo é executado como programa, o valor é "__main__". Quando é importado, o valor é o nome do módulo. Esse teste permite que o mesmo arquivo seja, ao mesmo tempo, uma biblioteca e um programa:

    basico/cap25_modulos.pylinhas 39 a 44
    def main():
        print(f"executando com __name__ = {__name__!r}")
    
    
    if __name__ == "__main__":
        main()
    
    Saída
    executando com __name__ = '__main__'
    

    Sem essa proteção, importar o módulo executaria o programa inteiro como efeito colateral.

    Como o Python encontra módulos

    O interpretador procura em sys.path, uma lista de pastas, na ordem. Depois de importado, o módulo fica guardado em sys.modules, e o segundo import apenas reaproveita o que já está lá:

    basico/cap25_modulos.pylinhas 49 a 51
    import sys
    
    print(type(sys.path).__name__, "math" in sys.modules)
    
    Saída
    list True
    

    Pacotes de terceiros vêm do PyPI e se instalam dentro de um ambiente virtual (capítulo 4), com pip install, uv add ou poetry add. Os pacotes próprios, com __init__.py e estrutura de pastas, voltam no capítulo de empacotamento.

    Exercício 1

    Dias entre duas datas

    Escreva dias_entre(inicio, fim) que receba datas no formato "2026-01-01" e devolva a quantidade de dias entre elas. Dica: date.fromisoformat.