2011-03-03 9 views
23

acabo de notar un comportamiento en el que argparse desconcertado mí (supongo que nunca lo había usado para obtener una lista de los archivos muda antes):¿Por qué argparse me da una lista en una lista?

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('multi', action='append', nargs='+') 
print(parser.parse_args()) 

Esto me da la salida:

~$ ./testargs.py foo bar baz 
Namespace(multi=[['foo', 'bar', 'baz']]) 
~$ 

I esperado multi para ser ['foo', 'bar', 'baz'], no es una lista dentro de una lista. Tal como está, tendré que tomar args.multi[0] antes del procesamiento, que no es gran cosa, pero se siente como una verruga fea, y me gustaría entender por qué está ahí.

¿Estoy haciendo algo tonto en add_argument, o es solo un capricho inevitable?

Respuesta

30

Usted está llamando

parser.add_argument('multi', action='append', nargs='+') 

y es tomando todos los argumentos y añadiendo como un solo elemento en la lista de múltiples.

Si lo desea como elementos individuales, simplemente no lo utiliza anexar

parser.add_argument('multi', nargs='+') 

De los documentos

áppend '- Este almacena una lista, y añade cada valor del argumento a la lista. Esto es útil para permitir que una opción se especifique varias veces. Ejemplo de uso:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('--foo', action='append') 
>>> parser.parse_args('--foo 1 --foo 2'.split()) 
Namespace(foo=['1', '2']) 
+2

Huh, tienes razón. Tengo una impresión equivocada de los documentos. Tal vez debería ver si puedo enviar un parche con una mejor redacción en algunas cosas. :) ¡Gracias! –

+1

Sin embargo, tenga en cuenta que sin 'action = 'append'', los valores anteriores se descartarán si la opción se especifica varias veces. p.ej. 'argv = ['- foo', 'a', 'b', '--foo', 'c']' dará 'Namespace (foo = ['c'])' para 'add_argument ('- foo ', nargs =' + ') '. –

Cuestiones relacionadas