J'ai un tel script:
import argparse
parser = argparse.ArgumentParser(
description='Text file conversion.'
)
parser.add_argument("inputfile", help="file to process", type=str)
parser.add_argument("-o", "--out", default="output.txt",
help="output name")
parser.add_argument("-t", "--type", default="detailed",
help="Type of processing")
args = parser.parse_args()
for arg in args:
print(arg)
Mais ça ne marche pas. Je reçois une erreur:
TypeError: 'Namespace' object is not iterable
Comment parcourir les arguments et leur valeur?
Veuillez ajouter "vars" si vous souhaitez parcourir l'item d'espace de noms:
for arg in vars(args):
print arg, getattr(args, arg)
Namespace
les objets ne sont pas itérables, les documents standard suggèrent de faire ce qui suit si vous voulez un dictionnaire:
>>> vars(args)
{'foo': 'BAR'}
Alors
for key,value in vars(args).iteritems():
# do stuff
Pour être honnête, je ne sais pas pourquoi vous voulez répéter les arguments. Cela va quelque peu à l'encontre de l'objectif d'avoir un analyseur d'arguments.
Après
args = parser.parse_args()
pour afficher les arguments, utilisez:
print args # or print(args) in python3
L'objet args
(de type argparse.Namespace
) N'est pas itérable (c'est-à-dire pas une liste), mais il a une méthode .__str__
, Qui affiche bien les valeurs.
args.out
Et args.type
Donnent les valeurs des 2 arguments que vous avez définis. Cela fonctionne la plupart du temps. getattr(args, key)
le moyen le plus général d'accéder aux valeurs, mais n'est généralement pas nécessaire.
vars(args)
transforme l'espace de noms en un dictionnaire auquel vous pouvez accéder avec toutes les méthodes du dictionnaire. Ceci est expliqué dans le docs
.
ref: le paragraphe Namespace de la documentation - https://docs.python.org/2/library/argparse.html#the-namespace-object
Analyser les _actions de votre analyseur semble être une bonne idée. Au lieu d'exécuter parse_args (), puis d'essayer de sélectionner des éléments dans votre espace de noms.
import argparse
parser = argparse.ArgumentParser(
description='Text file conversion.')
parser.add_argument("inputfile", help="file to process", type=str)
parser.add_argument("-o", "--out", default="output.txt",
help="output name")
parser.add_argument("-t", "--type", default="detailed",
help="Type of processing")
options = parser._actions
for k in options:
print(getattr(k, 'dest'), getattr(k, 'default'))
Vous pouvez par exemple modifier la partie 'dest' en 'choix' si vous avez besoin des valeurs par défaut prédéfinies pour un paramètre dans un autre script (en renvoyant les options dans une fonction par exemple).
J'utilise args.__dict__
, qui vous permet d'accéder à la structure de dict sous-jacente. Ensuite, c'est une simple itération clé-valeur:
for k in args.__dict__:
print k, args.__dict__[k]
ArgumentParser.parse_args
renvoie un objet Namespace
au lieu d'un tableau itérable.
Pour votre référence, https://docs.python.org/3/library/argparse.html#parsing-arguments
ArgumentParser parses arguments through the parse_args() method. This will inspect the command line, convert each argument to the appropriate type and then invoke the appropriate action.
Et ce n'est pas censé être utilisé comme ça. Considérez votre cas d'utilisation, dans le document, il est dit argparse
va comprendre comment analyser ceux de sys.argv
. , ce qui signifie que vous n'avez pas à répéter ces arguments.