argparse
argparse é o analisador de CLI da biblioteca padrão do Python. Ele gera --help, valida tipos e suporta subcomandos sem dependências de terceiros.
Receita
import argparse
def main():
parser = argparse.ArgumentParser(prog="invoice", description="Gerenciar faturas")
parser.add_argument("--format", choices=["json", "csv"], default="json")
parser.add_argument("id", type=int, nargs="?", help="ID da fatura")
args = parser.parse_args()
print(args)
if __name__ == "__main__":
main()Quando usar isso:
- CLI sem dependências externas
- Scripts que precisam de
--helpe validação de tipo - Ferramentas onde apenas a biblioteca padrão é um requisito
Exemplo de Trabalho
import argparse
import sys
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
prog="deploy",
description="Implantar aplicação em ambientes",
)
parser.add_argument("--verbose", "-v", action="count", default=0)
sub = parser.add_subparsers(dest="env", required=True)
for name in ("staging", "production"):
p = sub.add_parser(name, help=f"Implantar em {name}")
p.add_argument("--dry-run", action="store_true")
p.add_argument("--tag", required=True, help="Tag da imagem Docker")
return parser
def main(argv: list[str] | None = None) -> int:
args = build_parser().parse_args(argv)
if args.verbose:
print(f"Implantando {args.tag} em {args.env}", file=sys.stderr)
if args.dry_run:
print("Simulação - nenhuma alteração feita")
return 0
# lógica de implantação aqui
return 0
if __name__ == "__main__":
raise SystemExit(main())O que isso demonstra:
- Subcomandos para
deploy staging/deploy production action="count"para verbosidade-v,-vvparse_args(argv)permite testes sem subprocessosraise SystemExit(main())para códigos de saída corretos
Mergulho Profundo
Argumentos Comuns
| Padrão | Código |
|---|---|
| Flag | action="store_true" |
| Valor Opcional | nargs="?" |
| Lista | nargs="+" |
| Escolhas | choices=["a", "b"] |
| Versão | action="version", version="1.0" |
Armadilhas
- Esquecer
required=Trueem subcomandos - nenhum comando é executado. Correção:required=True(Python 3.7+). - Não testável - apenas
parse_args()sem argv. Correção: passarargvlist em testes. - Texto de ajuda como reflexão tardia - usuários confusos. Correção:
help=em cada argumento. - Imprimir segredos em padrões argparse - visível em
--help. Correção: carregar segredos do ambiente em tempo de execução. - argparse para comandos aninhados complexos - verboso. Correção: considerar Click ou Typer com 5+ subcomandos.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Click | Decoradores ergonômicos | Requer apenas biblioteca padrão |
| Typer | Orientado por type hints | Sem type hints no projeto |
| fire | CLI instantânea de qualquer objeto | Qualidade de CLI de produção necessária |
FAQs
argparse ou Click?
argparse para ferramentas simples e sem dependências. Click/Typer para CLIs complexas.
Como testar argparse?
parser.parse_args(["--format", "csv", "42"]).
Grupos mutuamente exclusivos?
group = parser.add_mutually_exclusive_group().
Tipos personalizados?
Função type=my_validator que converte ou levanta ArgumentTypeError.
Como mostrar padrões na ajuda?
argument_default=argparse.SUPPRESS para ocultar, ou deixar o padrão para mostrar.
significado de nargs?
Zero ou um argumento. Torna o posicional opcional.
Como analisar arquivos de configuração?
argparse lida apenas com a CLI. Carregue o arquivo de configuração separadamente; a CLI substitui.
Flag booleana --no-flag?
action=argparse.BooleanOptionalAction fornece --flag / --no-flag (3.9+).
Epílogo para exemplos?
parser = argparse.ArgumentParser(epilog="Exemplos: ...", formatter_class=argparse.RawDescriptionHelpFormatter).
Como descontinuar uma flag?
Mostrar aviso no manipulador; documentar na ajuda como descontinuado.
Relacionado
- Fundamentos de CLI - Fundamentos de CLI
- Click - alternativa com decoradores
- Configuração e Ambiente - camadas de configuração
- Melhores Práticas de CLI - regras de design
Versões da Pilha: Esta página foi escrita para Python 3.14.0, FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.