TL; DR
Verwenden Sie die nargs
Option oder die 'append'
Einstellung der action
Option (je nachdem, wie sich die Benutzeroberfläche verhalten soll).
Nargs
parser.add_argument('-l','--list', nargs='+', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 2345 3456 4567
nargs='+'
nimmt 1 oder mehr Argumente, nargs='*'
nimmt null oder mehr.
anhängen
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
Mit append
bieten Sie die Möglichkeit, die Liste mehrmals aufzubauen.
Nicht benutzen type=list
!!! - Es gibt wahrscheinlich keine Situation, in der Sie verwenden möchtentype=list
mit argparse
. Je.
Schauen wir uns einige der verschiedenen Möglichkeiten und das Endergebnis genauer an.
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)
Hier ist die Ausgabe, die Sie erwarten können:
$ 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']
Imbissbuden :
- Verwenden
nargs
oderaction='append'
nargs
kann aus Anwendersicht einfacher sein, aber es kann nicht intuitiv sein, wenn es Positionsargumente gibt, weil argparse
nicht gesagt werden kann, was ein Positionsargument sein soll und was zu dem gehört nargs
; Wenn Sie dann Positionsargumente habenaction='append'
möglicherweise die bessere Wahl.
- Das Obige ist nur wahr, wenn
nargs
gegeben '*'
ist '+'
, oder '?'
. Wenn Sie eine Ganzzahl (z. B. 4
) angeben, gibt es keine Probleme beim Mischen von Optionen mit nargs
und Positionsargumenten, daargparse
genau bekannt ist, wie viele Werte für die Option zu erwarten sind.
- Verwenden Sie keine Anführungszeichen in der Befehlszeile 1
- Nicht benutzen
type=list
, da eine Liste mit Listen zurückgegeben wird
- Dies geschieht, weil unter der Haube
argparse
der Wert von verwendet wird type
, um jedes einzelne gegebene Argument zu erzwingen Ihnen gewähltetype
, nicht das Aggregat aller Argumente.
- Sie können
type=int
(oder was auch immer) verwenden, um eine Liste von Ints (oder was auch immer) zu erhalten.
1 : Ich meine im Allgemeinen nicht. Ich meine, Anführungszeichen zu verwenden, um eine Liste zu übergeben,argparse
ist nicht das, was Sie wollen.