argparse & configparser
argparse constrói interfaces de linha de comando (CLI) com --flags, subcomandos e texto de ajuda. configparser lê arquivos no estilo INI para padrões em camadas - combine com variáveis de ambiente para aplicativos do tipo twelve-factor.
Receita
import argparse
parser = argparse.ArgumentParser(description="Demo CLI")
parser.add_argument("--verbose", action="store_true")
parser.add_argument("name")
args = parser.parse_args(["Ada", "--verbose"])Quando usar isso:
- Ferramentas CLI internas e scripts de desenvolvimento
- Configuração INI legada (
setup.cfg, logging.ini) - Typer/click ainda não justificados
- Ferramentas baseadas em subcomandos (estilo
git) - Padrão de arquivo de configuração padrão + substituição por CLI
Exemplo de Trabalho
import argparse
import configparser
from pathlib import Path
def build_parser() -> argparse.ArgumentParser:
p = argparse.ArgumentParser()
p.add_argument("--config", type=Path, default=Path("app.ini"))
p.add_argument("--port", type=int)
return p
def load_config(path: Path) -> configparser.ConfigParser:
cfg = configparser.ConfigParser()
if path.exists():
cfg.read(path, encoding="utf-8")
return cfg
def resolve_port(args: argparse.Namespace, cfg: configparser.ConfigParser) -> int:
if args.port is not None:
return args.port
if cfg.has_option("server", "port"):
return cfg.getint("server", "port")
return 8000
args = build_parser().parse_args(["--port", "9000"])
cfg = load_config(args.config)
print(resolve_port(args, cfg))O que isso demonstra:
- Substituições da CLI batem a configuração de arquivo que bate os padrões
- Seções do
configparseregetterstipados (getint) - Tipo
Pathpara caminhos doargparse - Codificação explícita na leitura para portabilidade
Mergulho Profundo
Recursos do argparse
nargs,choices,metavaradd_subparserspara subcomandosArgumentDefaultsHelpFormattermostra os padrões
Notas do configparser
- Interpolação
%(section)sopcional ConfigParsernão suporta TOML completo - usetomllibparapyproject
Armadilhas
- Flags booleanas incorretas -
type=boolquebrado. Correção:action="store_true". - Confusão entre opcional e obrigatório - documente claramente posicional vs. opcional.
- Configuração silenciosamente ausente - padrões vazios surpreendem. Correção: valide seções obrigatórias após a leitura.
- Segredos em INI - arquivos legíveis por qualquer um. Correção: variáveis de ambiente para segredos, não configuração commitada.
- argparse na importação da biblioteca -
parse_argsno lado do efeito colateral da importação. Correção: proteja emmain().
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| typer/click | UX de CLI Rica | Script de dependência zero |
| tomllib | pyproject TOML | Apenas INI legado |
| pydantic-settings | Configuração de ambiente validada | Script pequeno |
FAQs
typer vs argparse?
typer tem DX melhor; argparse é biblioteca padrão de dependência zero.
padrão de substituição de env?
os.environ.get após argparse - documente a ordem de precedência.
subcomandos?
subparsers = parser.add_subparsers(dest="command", required=True).
configparser write?
cfg.write(open(path,"w")) - comentários do usuário não são garantidos em edições de ida e volta.
--help automático?
argparse gera ajuda - preencha description e epilog.
nargs=+
Um ou mais tokens posicionais coletados em uma lista.
INI vs TOML?
Prefira tomllib/pyproject para novas configurações; configparser apenas para INI legado.
pytest cli?
Invoque main(argv) com lista explícita - não confie na mutação global de sys.argv.
completion?
argcomplete PyPI opcional; typer tem caminhos de completion de shell integrados.
comandos de gerenciamento do Django?
Django envolve uma API semelhante ao argparse - separado de scripts autônomos.
Relacionado
- subprocess - Ferramentas CLI geram processos
- pathlib & os - Caminhos de configuração
- Visão Geral da Biblioteca Padrão - mapa
- Melhores Práticas da Biblioteca Padrão - política de CLI/configuração
Versões da Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), 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+.