usage python3 parser float argumentparser argument arg python argparse

python3 - python argparse argumentparser()



Cómo iterar sobre argumentos (6)

Agregue ''vars'' si desea iterar sobre el objeto de espacio de nombres:

for arg in vars(args): print arg, getattr(args, arg)

Tengo tal 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)

Pero no funciona. Me sale un error:

TypeError: ''Namespace'' object is not iterable

¿Cómo iterar sobre los argumentos y su valor?


Analizar las _acciones de su analizador parece una idea decente. En lugar de ejecutar parse_args () y luego intentar eliminar cosas de tu espacio de nombres.

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

Puede modificar la parte ''dest'' para que sea ''opciones'', por ejemplo, si necesita los valores predeterminados predeterminados para un parámetro en otro script (por ejemplo, devolviendo las opciones en una función).


Después

args = parser.parse_args()

para mostrar los argumentos, use:

print args # or print(args) in python3

El objeto args (de tipo argparse.Namespace ) no es iterable (es decir, no es una lista), pero tiene un método .__str__ , que muestra muy bien los valores.

args.out y args.type proporcionan los valores de los 2 argumentos que definió. Esto funciona la mayor parte del tiempo. getattr(args, key) la forma más general de acceder a los valores, pero generalmente no es necesario.

vars(args)

convierte el espacio de nombres en un diccionario, al que puede acceder con todos los métodos del diccionario. Esto se explica en los docs .

ref: el párrafo del espacio de nombres de los documentos - https://docs.python.org/2/library/argparse.html#the-namespace-object


Estoy usando args.__dict__ , que te permite acceder a la estructura de dict subyacente. Entonces, es una simple iteración de clave-valor:

for k in args.__dict__: print k, args.__dict__[k]


Namespace objetos del Namespace no son iterables, los documentos estándar sugieren hacer lo siguiente si desea un diccionario:

>>> vars(args) {''foo'': ''BAR''}

Asi que

for key,value in vars(args).iteritems(): # do stuff

Para ser honesto, no estoy seguro de por qué quiere iterar sobre los argumentos. Eso en cierto modo frustra el propósito de tener un analizador de argumentos.


ArgumentParser.parse_args devuelve un objeto de Namespace lugar de una matriz iterable.

Para su referencia, 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.

Y no se supone que sea usado así. Considere su caso de uso, en el documento, dice que argparse descubrirá cómo analizarlos de sys.argv . , lo que significa que no tiene que iterar sobre esos argumentos.