argparse permet de créer des scripts ergonomiques avec --help, options et validations.
objectifs
- définir un parser et des arguments
- générer une aide (
-h/--help) - retourner des codes de sortie corrects
explication détaillée
ArgumentParser(prog, description)add_argument(): positionnels, flags (action='store_true'), typesparse_args()retourneargssys.exit(code)pour signaler l’état au shell
exemples exécutables
# greet.py
import argparse
def main(argv=None):
p = argparse.ArgumentParser(prog="greet", description="saluer une personne")
p.add_argument("name")
p.add_argument("--upper", action="store_true", help="afficher en majuscules")
args = p.parse_args(argv)
msg = f"salut {args.name}"
print(msg.upper() if args.upper else msg)
if __name__ == "__main__":
main()
python greet.py alex --upper
# wc.py : compter lignes/mots/caractères
import argparse, sys, re
def main(argv=None):
p = argparse.ArgumentParser(prog="wc")
p.add_argument("path")
p.add_argument("--lines", action="store_true")
p.add_argument("--words", action="store_true")
p.add_argument("--chars", action="store_true")
args = p.parse_args(argv)
try:
text = open(args.path, encoding="utf-8").read()
except OSError as e:
print(f"erreur: {e}", file=sys.stderr)
sys.exit(1)
out = []
if args.lines or not any([args.lines, args.words, args.chars]):
out.append(("lignes", text.count("\n")+1 if text else 0))
if args.words:
out.append(("mots", len(re.findall(r"\w+", text))))
if args.chars:
out.append(("chars", len(text)))
for k,v in out:
print(f"{k}: {v}")
if __name__ == "__main__":
main()
bonnes pratiques
- messages d’erreur clairs →
stderr+ code ≠ 0 --helpsoigné (descriptions, exemples)- sous‑commandes via
add_subparsers()pour gros outils
pièges courants
- parser global créé au niveau module → compliqué à tester
- confusion entre
type=intetchoices=[...] - ne pas gérer les erreurs d’IO
exercices
- réécrire
wcavec sous‑commandescount-lines,count-words,count-chars. - ajouter
--out filepour écrire le résultat. - valider et normaliser une option
--langparmi{fr,en}.