argparse option pour passer d'une liste comme option
Je suis en train de passer d'une liste d'argument pour un programme en ligne de commande. Est-il un argparse
option pour passer d'une liste comme option?
parser.add_argument('-l', '--list',
type=list, action='store',
dest='list',
help='<Required> Set flag',
required=True)
Script est appelé comme ci-dessous
python test.py -l "265340 268738 270774 270817"
Vous devez vous connecter pour publier un commentaire.
TL;DR
Utiliser le
nargs
option ou le'append'
réglage de laaction
option (en fonction de comment vous voulez que l'interface utilisateur de se comporter).nargs
nargs='+'
prend 1 ou plusieurs arguments,nargs='*'
prend zéro ou plus.ajouter
Avec
append
vous fournir l'option plusieurs fois pour construire la liste.Ne pas utiliser
type=list
!!! - Il n'y a probablement pas de situation où vous souhaitez utilisertype=list
avecargparse
. Jamais.Jetons un coup d'oeil de plus près quelques-unes des différentes façons on pourrait, pour ce faire, et le résultat final.
Ici est la sortie que vous pouvez attendre de nous:
Plats à emporter:
nargs
ouaction='append'
nargs
peut être plus simple à partir d'un point de vue utilisateur, mais il peut être non-intuitif si il y a des arguments de position parce queargparse
peut pas dire ce qui devrait être une position d'argument et ce qui appartient à lanargs
; si vous avez des arguments de position puisaction='append'
peut-être un meilleur choix.nargs
est donné'*'
,'+'
, ou'?'
. Si vous fournissez un nombre entier (comme4
) alors il n'y aura pas de problème de mélange des options avecnargs
et les arguments de position parce queargparse
permettra de savoir exactement combien de valeurs à attendre pour l'option.type=list
, comme il sera de retour une liste de listesargparse
utilise la valeur detype
afin de le contraindre à chaque argument donné vous choisitype
, pas le total de tous les arguments.type=int
(ou autre) pour obtenir une liste d'entiers (ou autre)1: je ne veux pas en général.. je veux dire à l'aide de citations de passer d'une liste à
argparse
n'est pas ce que vous voulez.add_argument
méthode interprète tout comme des chaînes de caractères, y compris les numéros. Vous devez être l'ajout de quelque chose de supplémentaire pour obtenir ces listes de listes. J'ai juste copié et collé ce que j'ai posté et n'a pas obtenu les listes de listes. Comment faites-vous appel àadd_argument
?type=list
option. Ne pas l'utiliser. Qui transforme une chaîne de caractères dans une liste, et donc les listes de listes.type
paramètre à un autre objet. Par défaut, cette méthode renvoie une liste de chaînes de caractères.-l 10 ' -20' ' -30'
avec le plus de naturel--list='10 -20 -30'
.argparse
semble chose que nombre d'options serait illégal de toute façon et analyse de la-
en tant que partie du nombre, non pas comme un argument (le bien-fondé de cette hypothèse peut être discutée d'ailleurs...).--
pourrait possibilités de split vs les arguments de position.prog --opt1 par1 ... -- posp1 posp2 ...
--
améliorer cette réponse?--
aide à comprendre cela comme montré dans l'exemple dans mon commentaire précédent. OIE utilisateur fournit--
suivie par tous les arguments de position.parser.add_argument('--nargs-int-type', nargs='+', type=int)
parser.add_argument('--nargs-int-type', nargs='+', type=int, default=[5])
, ouparser.add_argument('--nargs-int-type', nargs='+', type=int, default=[1, 2, 3, 4, 5])
?Je préfère passer une chaîne délimitée qui, je l'analyser plus tard dans le script. Les raisons à cela sont; la liste peut être de tout type
int
oustr
, et parfois à l'aide denargs
je rencontrer des problèmes si il y a plusieurs arguments optionnels et les arguments de position.Puis,
ou,
fonctionnera très bien. Le séparateur peut être un espace, aussi, ce qui serait bien de faire appliquer des guillemets autour de la valeur de l'argument, comme dans l'exemple de la question.
type
argumentlambda s: [int(time) for item in s.split(',')]
au lieu de post-traitementargs.list
.int(time)
devrait êtreint(item)
. Mon exemple est une version simplifiée de ce qui en général, je fais, où je case à beaucoup d'autres choses plutôt que d'un simple traitement. Mais simplement pour répondre à la question, j'ai trop à trouver votre chemin plus élégant..En outre à
nargs
, vous pouvez utiliserchoix
si vous connaissez la liste à l'avance:À l'aide de nargs paramètre dans argparse de add_argument méthode
- Je utiliser nargs=' " comme un add_argument paramètre. J'ai utilisé spécifiquement nargs='' à la possibilité de choisir les paramètres par défaut si je ne suis pas de passage explicite les arguments
Y compris un extrait de code comme exemple:
Exemple: temp_args1.py
Veuillez Noter: ci-dessous un exemple de code est écrit en python3. En modifiant l'instruction print format, peut exécuter en python2
Note: je suis la collecte de plusieurs arguments de chaîne qui est mémorisé dans la liste - opts.accédez à la liste
Si vous voulez la liste d'entiers, modifiez le paramètre type sur l'analyseur.add_argument int
Résultat De L'Exécution:
temp_args1.py -i [item5 ,item6, item7]
et à la sortie prendre la forme d'une liste (au lieu de la liste imbriquée)Si vous avez l'intention de faire un seul commutateur de prendre plusieurs paramètres, puis vous utilisez
nargs='+'
. Si votre exemple '-l' est en fait de prendre les entiers:Produit
Si vous spécifiez le même argument à plusieurs reprises, l'action par défaut (
'store'
) remplace les données existantes.L'alternative est d'utiliser le
append
action:Qui produit
Ou vous pouvez écrire un gestionnaire personnalisé/action pour analyser les valeurs séparées par des virgules afin que vous puissiez faire
Dans
add_argument()
,type
est juste un objet appelable qui reçoit une chaîne de caractères et renvoie la valeur d'option.Ceci permettra de:
Peut-être la réponse la plus simple