Script de linha de comandos robusto em Python, com testes

Escreva um script de linha de comandos em Python pronto para produção: argparse, logging, tratamento de erros, códigos de saída e testes com pytest. Pensado para ChatGPT, Claude e Microsoft Copilot. Inclui 6 variáveis personalizáveis e pode copiá-lo gratuitamente com um clique.

Intermédio · Código · Pendente de revisão editorial

Prompt

Age como um programador Python sénior que escreve ferramentas internas fáceis de manter.

Preciso de um script de linha de comandos chamado `{{script_name}}` que faça o seguinte: {{task}}.
Entradas: {{inputs}}.
Saídas esperadas: {{outputs}}.
Versão de Python: {{python_version}}. Dependências permitidas: {{dependencies}}.

Entrega, por esta ordem:
1. Desenho da interface: subcomandos (se fizerem sentido), argumentos posicionais, opções com valores por omissão e um exemplo de saída de `--help`.
2. O código completo num único ficheiro, com:
   - `argparse`, `main(argv=None) -> int` e a proteção `if __name__ == "__main__"`.
   - `logging` configurável com `--verbose` e `--quiet`, mensagens para stderr e resultados para stdout.
   - Anotações de tipos completas, `pathlib` para caminhos e funções pequenas e puras separadas das operações de E/S.
   - Uma opção `--dry-run` se o script modificar ficheiros ou sistemas externos.
   - Códigos de saída documentados (0 sucesso, 1 erro de utilização, 2 erro nos dados, etc.).
3. Tratamento de erros: que exceções são capturadas, mensagens claras para o utilizador e sem tracebacks, exceto em modo verbose.
4. Testes com `pytest` (usando `tmp_path` e `capsys`) para o caminho feliz, entradas inválidas e casos-limite.
5. Instruções de utilização e como o empacotar com `pyproject.toml` como comando instalável.

Restrições:
- Segue a PEP 8 e não uses dependências fora da lista permitida.
- Não assumas formatos de dados que eu não tenha descrito: pergunta-me ou usa [PREENCHER].

Como utilizar

  1. Explique a tarefa com um exemplo real de entrada e de saída.
  2. Diga se pode instalar dependências ou se tem de se limitar à biblioteca padrão.
  3. Guarde o script e os testes e execute o pytest antes de o usar com dados reais.
  4. Experimente sempre primeiro com --dry-run.

Exemplo de utilização

Script: renomear-faturas · Tarefa: renomear PDFs de faturas com a data e o fornecedor indicados num CSV · Apenas biblioteca padrão.

Exemplo de resultado

2. Código (excerto de renomear_faturas.py)

from __future__ import annotations

import argparse
import csv
import logging
import sys
from pathlib import Path

log = logging.getLogger("renomear-faturas")


def novo_nome(data: str, fornecedor: str) -> str:
    """Função pura: '2025-03-14', 'Papelaria Sol' -> '2025-03-14_papelaria-sol.pdf'."""
    return f"{data}_{'-'.join(fornecedor.lower().split())}.pdf"


def ler_csv(caminho: Path) -> dict[str, str]:
    with caminho.open(newline="", encoding="utf-8") as f:
        return {linha["ficheiro"]: novo_nome(linha["data"], linha["fornecedor"]) for linha in csv.DictReader(f)}


def main(argv: list[str] | None = None) -> int:
    p = argparse.ArgumentParser(prog="renomear-faturas", description="Renomeia faturas PDF a partir de um CSV.")
    p.add_argument("pasta", type=Path)
    p.add_argument("csv", type=Path)
    p.add_argument("--dry-run", action="store_true", help="mostra as alterações sem as aplicar")
    nivel = p.add_mutually_exclusive_group()
    nivel.add_argument("-v", "--verbose", action="store_true")
    nivel.add_argument("-q", "--quiet", action="store_true")
    args = p.parse_args(argv)
    logging.basicConfig(level=logging.DEBUG if args.verbose else logging.ERROR if args.quiet else logging.INFO)

    try:
        alteracoes = ler_csv(args.csv)
    except (OSError, KeyError) as e:
        log.error("Não foi possível ler o CSV: %s", e)
        return 2
    for antigo, novo in alteracoes.items():
        origem, destino = args.pasta / antigo, args.pasta / novo
        if not origem.exists() or destino.exists():
            log.warning("Ignorado: %s", antigo)
            continue
        print(f"{antigo} -> {novo}")
        if not args.dry_run:
            origem.rename(destino)
    return 0


if __name__ == "__main__":
    sys.exit(main())

Códigos de saída: 0 sucesso, 1 erro de utilização (o argparse devolve 2 por omissão: [PREENCHER] se os quiser uniformizar), 2 erro nos dados. O formato da data no CSV não foi descrito: [PREENCHER]…

Dados-chave

Categoria
Programação e desenvolvimento · Python
Tipo de resultado
Código
Nível
Intermédio
Pensado para
ChatGPT, Claude e Microsoft Copilot
Verificado em
Pendente de verificação editorial
Variáveis
Nome do script, Tarefa, Entradas, Saídas, Versão de Python e Dependências permitidas
Idioma
Português
Preço
Gratuito, sem registo
Atualizado
07/11/2026

Perguntas frequentes

Porquê argparse em vez de Click ou Typer?

O argparse vem com o Python e não acrescenta dependências, o que ajuda em servidores restritos. Se puder instalar pacotes, indique Typer ou Click como dependências permitidas e o prompt adapta-se.

O que ganho em separar a lógica das operações de E/S?

Pode testar a lógica com testes rápidos que nunca tocam em ficheiros reais, e reutilizá-la noutros scripts ou numa API.

Para que serve este prompt?

Escreva um script de linha de comandos em Python pronto para produção: argparse, logging, tratamento de erros, códigos de saída e testes com pytest.

Com que ferramentas de IA funciona?

Foi pensado para ChatGPT, Claude e Microsoft Copilot. Ainda não o verificámos nestas ferramentas, pelo que os resultados podem variar entre elas.

Como personalizo o prompt?

Clique em “Personalizar” e preencha as variáveis (Nome do script, Tarefa, Entradas, Saídas, Versão de Python e Dependências permitidas). O texto atualiza-se instantaneamente e pode depois copiá-lo com um clique. Os valores ficam guardados apenas no seu navegador.

Preciso de experiência para o utilizar?

É de nível intermédio: convém conhecer o tema para fornecer bom contexto e rever o resultado com sentido crítico.

Este prompt é gratuito?

Sim. Todos os prompts do HomeCasa Prompts são gratuitos, sem registo nem subscrição. Pode também utilizá-los em projetos profissionais.

Posso confiar no resultado da IA?

Trate-o como um rascunho de qualidade: verifique sempre os dados, os números e as afirmações importantes antes de publicar ou tomar decisões.

Prompts relacionados