Path: ...!news.mixmin.net!aioe.org!K7PIs9tCGQ+WHJa7e6BylQ.user.46.165.242.75.POSTED!not-for-mail From: Alain Ketterlin Newsgroups: fr.comp.os.unix Subject: Re: =?utf-8?Q?r=C3=A8gle?= pour =?utf-8?Q?=C3=A9crire?= les "usage: ..." Date: Wed, 13 Jul 2022 13:45:43 +0200 Organization: =?utf-8?Q?Universit=C3=A9?= de Strasbourg Message-ID: <871qupxml4.fsf@universite-de-strasbourg.fr.invalid> References: <62c8c4eb$0$24781$426a74cc@news.free.fr> <62c98a7b$0$18716$426a74cc@news.free.fr> <87a69ix9rl.fsf@universite-de-strasbourg.fr.invalid> <62cc5318$0$18751$426a34cc@news.free.fr> <875yk3xsbg.fsf@universite-de-strasbourg.fr.invalid> <62ce256c$0$22264$426a34cc@news.free.fr> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: gioia.aioe.org; logging-data="2416"; posting-host="K7PIs9tCGQ+WHJa7e6BylQ.user.gioia.aioe.org"; mail-complaints-to="abuse@aioe.org"; User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) X-Notice: Filtered by postfilter v. 0.9.2 Cancel-Lock: sha1:uroeciClJqr5zc0saG0BeOjviME= Bytes: 4823 Lines: 99 Thomas writes: > par ex, que diriez vous si je d=C3=A9cidais de rendre dir obligatoire ? > usage: rapid [-v] -ni dir gui_file ... > au lieu de > usage: rapid [-v] -ni [-od dir] gui_file ... C'est =C3=A0 toi de d=C3=A9cider. > https://semver.org/ > qu'il faut attendre la prochaine version majeure pour changer les=20 > options ? Pour une application, ajouter ou modifier le sens des options est selon moi une changement d'API. >> accepter "-vn" comme "-v -n", >> accepter "-odir" comme "-o dir", > > est-ce que c'est qqch que les usagers utilisent bcp, =C3=A7a ? > parce que moi je trouve =C3=A7a plut=C3=B4t emb=C3=AAtant, avec notamment= : > "-onv" =3D "-o -n -v", ou > "-onv" =3D> dir =3D "nv" ? La seconde. Si un argument contient plusieurs options, la premi=C3=A8re n=C3=A9cessitant un argument d'option s'impose : l'argument de l'option est soit la suite, soit l'argument suivant. -onv =3D> -o nv -nvo dir =3D> -n -v -o dir -nvovn =3D> -n -v -o vn >> Tellement pratique qu'on cherche rarement ailleurs. Par contre cela >> oblige =C3=A0 la fin =C3=A0 v=C3=A9rifier la coh=C3=A9rence (si il y a u= ne option -o il faut >> qu'il y ait aussi l'option -n). > > donc il faut g=C3=A9rer l'erreur =C3=A0 ce moment l=C3=A0 (-o en trop ou = -n manquant ?). > il faut aussi v=C3=A9rifier s'il y a des options non autoris=C3=A9es qui = ont =C3=A9t=C3=A9=20 > utilis=C3=A9es, v=C3=A9rifier je ne sais pas bien comment s'il y a bien e= u un=20 > argument pour -o, ... Bon c'est quand m=C3=AAme pas la mer =C3=A0 boire. Voil=C3=A0 ce que =C3=A7= a donnerait (dans un langage imaginaire) # argc et tableau argv fournis (arguments du prog =C3=A0 partir de 1) optind =3D 1 opt_v =3D opt_ni =3D opt_od =3D False dir =3D "/valeur/par/d=C3=A9faut" # analyser toutes les options while optind < argc and argv[optind][0] =3D=3D "-": if argv[optind] in ["-v", "--verbose"]: opt_v =3D True; optind +=3D 1 elif argv[optind] in ["-ni", "--new-iork"]: opt_ni =3D True; optind +=3D 1 elif argv[optind] in ["-od", "--output-dir"] and optind+1 < argc: opt_od =3D True; dir =3D argv[optind+1]; optind +=3D 2 else: wtf ("option inconnue") # v=C3=A9rifier la coh=C3=A9rence if opt_n =3D=3D False and opd_od =3D=3D True: wtf ("-od sans -ni") if optind =3D=3D argc: wtf ("pas de gui_file") On peut affiner le cas d'erreur o=C3=B9 "-od" est le dernier =C3=A9l=C3=A9m= ent. On peut aussi tester la duplication des options (si le opt_x est d=C3=A9j=C3=A0 Tru= e). On peut aussi pr=C3=A9voir "-oddir" (=C3=A7a complique le test et la logique p= our l'incr=C3=A9mentation de optind), etc. Le test de coh=C3=A9rence final a exactement la meme structure que celui que tu fais en analysant les arguments (sauf qu'il teste seulement les diff=C3=A9rents bool=C3=A9ens). Si tu veux autoriser des options apr=C3=A8s les gui_files, c'est un peu plus compliqu=C3=A9 (il faut m=C3=A9moriser la position du premier gui_file, et = tout d=C3=A9caler d=C3=A8s que tu trouves une option). (=C3=80 mon avis, ce n'est pas assez gratifiant pour se passer de getopt() = ou s'=C3=A9carter de ses conventions, mais chacun son truc.) > getopt(), en plus d'ajouter une d=C3=A9pendance C'est Posix, il y a de fortes chances que la d=C3=A9pendance soit d=C3=A9j= =C3=A0 satisfaite. -- Alain.