TL; DR
Use la nargs
opción o la 'append'
configuración de la action
opción (dependiendo de cómo desee que se comporte la interfaz de usuario).
nargs
parser.add_argument('-l','--list', nargs='+', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 2345 3456 4567
nargs='+'
toma 1 o más argumentos, nargs='*'
toma cero o más.
adjuntar
parser.add_argument('-l','--list', action='append', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 -l 2345 -l 3456 -l 4567
Con append
usted proporciona la opción varias veces para construir la lista.
¡No lo uses type=list
! - Probablemente no hay situación en la que se desea utilizar type=list
con argparse
. Siempre.
Echemos un vistazo con más detalle a algunas de las diferentes formas en que uno podría intentar hacer esto, y el resultado final.
import argparse
parser = argparse.ArgumentParser()
# By default it will fail with multiple arguments.
parser.add_argument('--default')
# Telling the type to be a list will also fail for multiple arguments,
# but give incorrect results for a single argument.
parser.add_argument('--list-type', type=list)
# This will allow you to provide multiple arguments, but you will get
# a list of lists which is not desired.
parser.add_argument('--list-type-nargs', type=list, nargs='+')
# This is the correct way to handle accepting multiple arguments.
# '+' == 1 or more.
# '*' == 0 or more.
# '?' == 0 or 1.
# An int is an explicit number of arguments to accept.
parser.add_argument('--nargs', nargs='+')
# To make the input integers
parser.add_argument('--nargs-int-type', nargs='+', type=int)
# An alternate way to accept multiple inputs, but you must
# provide the flag once per input. Of course, you can use
# type=int here if you want.
parser.add_argument('--append-action', action='append')
# To show the results of the given option to screen.
for _, value in parser.parse_args()._get_kwargs():
if value is not None:
print(value)
Aquí está la salida que puede esperar:
$ python arg.py --default 1234 2345 3456 4567
...
arg.py: error: unrecognized arguments: 2345 3456 4567
$ python arg.py --list-type 1234 2345 3456 4567
...
arg.py: error: unrecognized arguments: 2345 3456 4567
$ # Quotes won't help here...
$ python arg.py --list-type "1234 2345 3456 4567"
['1', '2', '3', '4', ' ', '2', '3', '4', '5', ' ', '3', '4', '5', '6', ' ', '4', '5', '6', '7']
$ python arg.py --list-type-nargs 1234 2345 3456 4567
[['1', '2', '3', '4'], ['2', '3', '4', '5'], ['3', '4', '5', '6'], ['4', '5', '6', '7']]
$ python arg.py --nargs 1234 2345 3456 4567
['1234', '2345', '3456', '4567']
$ python arg.py --nargs-int-type 1234 2345 3456 4567
[1234, 2345, 3456, 4567]
$ # Negative numbers are handled perfectly fine out of the box.
$ python arg.py --nargs-int-type -1234 2345 -3456 4567
[-1234, 2345, -3456, 4567]
$ python arg.py --append-action 1234 --append-action 2345 --append-action 3456 --append-action 4567
['1234', '2345', '3456', '4567']
Comida para llevar :
- Use
nargs
oaction='append'
nargs
puede ser más directo desde la perspectiva del usuario, pero puede no ser intuitivo si hay argumentos posicionales porque argparse
no se puede decir qué debería ser un argumento posicional y qué pertenece al nargs
; Si tiene argumentos posicionales, action='append'
puede terminar siendo una mejor opción.
- Lo anterior sólo es cierto si
nargs
se da '*'
, '+'
o '?'
. Si proporciona un número entero (como 4
), no habrá problemas para mezclar opciones nargs
y argumentos posicionales porque argparse
sabrá exactamente cuántos valores esperar para la opción.
- No use comillas en la línea de comando 1
- No lo use
type=list
, ya que devolverá una lista de listas
- Esto sucede porque debajo del capó
argparse
usa el valor de type
para coaccionar cada argumento dado individual que haya elegido type
, no el agregado de todos los argumentos.
- Puede usar
type=int
(o lo que sea) para obtener una lista de entradas (o lo que sea)
1 : No me refiero en general. Me refiero a que usar comillas para pasar una listaargparse
no es lo que quieres.