Python argparse option de sous-arguments
J'aimerais avoir un argument à mon programme qui a certains paramètres requis ainsi que certains paramètres facultatifs. Quelque chose comme ceci:
[--print text [color [size]]
de sorte que vous pourriez passer un de ces:
mycommand --print hello
mycommand --print hello blue
mycommand --print hello red 12
Il pourrait y avoir plusieurs de ces il doit être en une seule add_argument. Par exemple:
[--print text [color]] [--output filename [overwrite]]
Je peux réaliser des arguments qui sont proches de ce que je veux:
>>> parser = argparse.ArgumentParser()
>>> act = parser.add_argument('--foo', nargs=3, metavar=('x','y','z'))
>>> act = parser.add_argument('--bar', nargs='?')
>>> act = parser.add_argument('--baz', nargs='*')
>>> parser.print_help()
usage: [-h] [--foo x y z] [--bar [BAR]] [--baz [BAZ [BAZ ...]]]
optional arguments:
-h, --help show this help message and exit
--foo x y z
--bar [BAR]
--baz [BAZ [BAZ ...]]
mais pas tout à fait. Est-il possible de faire cela avec argparse? Je sais que je pourrais faire d'eux tous, nargs="*"
mais alors, l'aide ne serait pas de la liste les noms des arguments optionnels. Si je passe nargs="*"
et d'un n-uplet pour metavar, argparse déclenche une exception.
OriginalL'auteur jterrace | 2011-03-10
Vous devez vous connecter pour publier un commentaire.
La lecture de la le code source (démarrer dans
take_action
), je crois que ce que vous voulez, c'est impossible. Tous les arguments d'analyse et de passer à des actions se fait sur la base nargs, et nargs est soit un nombre,,OPTIONAL
("?"),ZERO_OR_MORE
("*"),ONE_OR_MORE
("+"),PARSER
, ouREMAINDER
. Ce doit être déterminé avant l'Action de l'objet (qui gère l'entrée), même voit ce qu'il se fait, donc il ne peut pas dynamiquement comprendrenargs
.Je pense que vous aurez besoin de vivre avec une solution de contournement. Je voudrais peut-être avoir
--foo-x x
,--foo-y y
, et--foo-z z
, et peut-être aussi--foo x y z
.OriginalL'auteur Devin Jeanpierre
Comment sur
Ensuite, vous obtenez quelque chose comme ceci:
Pouvez-vous donner un exemple pour plusieurs? Mon exemple revient à l'option des arguments de position, les deux étant nargs='?', donc, en fonction de ce que vous devez faire, il pourrait se faire sans subparsers. ou plusieurs subparsers.. 🙂
J'ai l'exemple dans mon OP: mycommand --print bonjour rouge 12 --nom du fichier de sortie écraser
Toutes mes excuses, je devrais probablement avoir lu la question plus clairement.. Vous pouvez simuler ce que vous êtes après, avec le
nargs='+'
ounargs='*'
, ce qui est déjà plus proche que vous est venu. metavar peut en effet prendre un tuple, mais ne peut définir deux noms (et non trois). Vous pouvez également remplacer l'aide, pour quelque chose commeparser.add_argument('--print', nargs='+', metavar=('text', 'color'), help='--print text [color [size]]')
OriginalL'auteur CNeo
Selon Devin jean-pierre de réponse, il semble que l'utilisation de '+' (un ou plus) au lieu de " * " qui ferait de ce que vous essayez d'atteindre.
(PS: j'ai juste commenté dans sa réponse, si j'avais assez de points)
OriginalL'auteur Siddardha
qui va travailler pour seul arg:
OriginalL'auteur Lareb Kinsky