web-dev-qa-db-fra.com

Comment parcourir les arguments

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?

44
user3654650

Veuillez ajouter "vars" si vous souhaitez parcourir l'item d'espace de noms:

 for arg in vars(args):
     print arg, getattr(args, arg)
69
James Sapam

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.

19
Christophe Biocca

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

7
hpaulj

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).

2
BoboDarph

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]
2
mork

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.

0
Victor Wong