KURZANTWORT
Verwenden Sie die nargs
Option oder die Option 'append'
Einstellung der action
(je nachdem, wie Sie das Verhalten der Benutzeroberfläche wünschen).
nargs
parser.add_argument('-l','--list', nargs='+', help='<Required> Set flag', required=True)
# Use like:
# python arg.py -l 1234 2345 3456 4567
nargs='+'
benötigt 1 oder mehrere 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
Sie bieten die Möglichkeit, die Liste mehrfach zu erstellen.
Verwenden Sie nicht type=list
!!! - Es gibt wahrscheinlich keine Situation, in der Sie die type=list
con argparse
. Niemals.
LANGE ANTWORT
Schauen wir uns einige der verschiedenen Möglichkeiten, wie man dies erreichen kann, 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']
Mitbringsel :
- Verwenden Sie
nargs
ou action='append'
nargs
kann aus Sicht des Benutzers einfacher sein, aber es kann unintuitiv sein, wenn es Positionsargumente gibt, weil argparse
kann nicht sagen, was ein Positionsargument sein soll und was zum nargs
Wenn Sie positionale Argumente haben, dann action='append'
könnte sich als die bessere Wahl erweisen.
- Die obige Aussage trifft nur zu, wenn
nargs
ist gegeben '*'
, '+'
, oder '?'
. Wenn Sie eine ganzzahlige Zahl angeben (z. B. 4
), dann ist es kein Problem, die Optionen mit nargs
und positionelle Argumente, weil argparse
weiß genau, wie viele Werte für die Option zu erwarten sind.
- Verwenden Sie keine Anführungszeichen in der Befehlszeile 1
- Verwenden Sie nicht
type=list
da es eine Liste von Listen zurückgibt
- Dies geschieht, weil unter der Haube
argparse
verwendet den Wert von type
zu erzwingen jedes einzelne angegebene Argument Sie Ihr gewähltes type
und nicht die Gesamtheit aller Argumente.
- Sie können verwenden
type=int
(oder was auch immer), um eine Liste von Ints (oder was auch immer) zu erhalten
1 : Ich meine nicht im Allgemeinen Ich meine die Verwendung von Anführungszeichen für eine Liste übergeben an argparse
ist nicht das, was Sie wollen.