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.