TL; DR
Utilisez l' nargs
option ou le 'append'
paramètre de l' action
option (selon la façon dont vous souhaitez que l'interface utilisateur se comporte).
nargs
parser.add_argument('-l','--list', nargs='+', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 2345 3456 4567
nargs='+'
prend 1 ou plusieurs arguments, nargs='*'
zéro ou plus.
ajouter
parser.add_argument('-l','--list', action='append', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 -l 2345 -l 3456 -l 4567
Avec append
vous fournissez l'option plusieurs fois pour constituer la liste.
Ne pas utiliser type=list
!!! - Il n'y a probablement pas de situation où vous voulez utiliser type=list
avec argparse
. Déjà.
Jetons un coup d'œil plus en détail sur certaines des différentes façons dont on pourrait essayer de le faire, et le résultat final.
import argparse
parser = argparse.ArgumentParser()
# By default it will fail with multiple arguments.
parser.add_argument('--default')
# Telling the type to be a list will also fail for multiple arguments,
# but give incorrect results for a single argument.
parser.add_argument('--list-type', type=list)
# This will allow you to provide multiple arguments, but you will get
# a list of lists which is not desired.
parser.add_argument('--list-type-nargs', type=list, nargs='+')
# This is the correct way to handle accepting multiple arguments.
# '+' == 1 or more.
# '*' == 0 or more.
# '?' == 0 or 1.
# An int is an explicit number of arguments to accept.
parser.add_argument('--nargs', nargs='+')
# To make the input integers
parser.add_argument('--nargs-int-type', nargs='+', type=int)
# An alternate way to accept multiple inputs, but you must
# provide the flag once per input. Of course, you can use
# type=int here if you want.
parser.add_argument('--append-action', action='append')
# To show the results of the given option to screen.
for _, value in parser.parse_args()._get_kwargs():
if value is not None:
print(value)
Voici la sortie à laquelle vous pouvez vous attendre:
$ python arg.py --default 1234 2345 3456 4567
...
arg.py: error: unrecognized arguments: 2345 3456 4567
$ python arg.py --list-type 1234 2345 3456 4567
...
arg.py: error: unrecognized arguments: 2345 3456 4567
$ # Quotes won't help here...
$ python arg.py --list-type "1234 2345 3456 4567"
['1', '2', '3', '4', ' ', '2', '3', '4', '5', ' ', '3', '4', '5', '6', ' ', '4', '5', '6', '7']
$ python arg.py --list-type-nargs 1234 2345 3456 4567
[['1', '2', '3', '4'], ['2', '3', '4', '5'], ['3', '4', '5', '6'], ['4', '5', '6', '7']]
$ python arg.py --nargs 1234 2345 3456 4567
['1234', '2345', '3456', '4567']
$ python arg.py --nargs-int-type 1234 2345 3456 4567
[1234, 2345, 3456, 4567]
$ # Negative numbers are handled perfectly fine out of the box.
$ python arg.py --nargs-int-type -1234 2345 -3456 4567
[-1234, 2345, -3456, 4567]
$ python arg.py --append-action 1234 --append-action 2345 --append-action 3456 --append-action 4567
['1234', '2345', '3456', '4567']
Points à retenir :
- Utilisez
nargs
ouaction='append'
nargs
peut être plus simple du point de vue de l'utilisateur, mais cela peut ne pas être intuitif s'il y a des arguments positionnels parce argparse
qu'il ne peut pas dire ce qui devrait être un argument positionnel et ce qui appartient au nargs
; si vous avez des arguments positionnels, cela action='append'
peut être un meilleur choix.
- Ce qui précède est vrai que si
nargs
est donné '*'
, '+'
ou '?'
. Si vous fournissez un nombre entier (tel que 4
), il n'y aura aucun problème à mélanger les options avec nargs
et les arguments positionnels car argparse
ils sauront exactement combien de valeurs attendre pour l'option.
- N'utilisez pas de guillemets sur la ligne de commande 1
- Ne pas utiliser
type=list
, car il renverra une liste de listes
- Cela se produit parce que sous le capot
argparse
utilise la valeur de type
pour contraindre chaque argument donné individuel que vous avez choisi type
, et non l'agrégat de tous les arguments.
- Vous pouvez utiliser
type=int
(ou autre) pour obtenir une liste des entiers (ou autre)
1 : Je ne veux pas dire en général .. Je veux dire utiliser des guillemets pour passer une listeargparse
n'est pas ce que vous voulez.