Argparse nargs = "+" isst Positionsargument

Hier ist ein Unterabschnitt meiner Parser-Konfiguration

parser.add_argument( 'infile', help="The file to be imported", type=argparse.FileType('r'), default=sys.stdin ) parser.add_argument( '--carpark', nargs='+', dest='CarparkID', type=int, default=[], help="One or many carpark IDs" ) 

Allerdings scheint das – --carpark Argument zu gierig zu sein und isst alles , was ihm folgt:

 $ mycommand --carpark 17 ~/path-to-file mycommand: error: argument --carpark: invalid int value: '/home/oli/path-to-file' 

Was ist ein guter Weg um so etwas? Ich muss eine Liste von Integer-IDs in den Befehl übergeben, aber auch eine Positionsdatei (die auch stdin sein kann).

Gibt es – zum Beispiel – eine nicht-gierige nargs Option, die nur so viel nargs wird, wie es sinnvoll ist?

2 Solutions collect form web for “Argparse nargs = "+" isst Positionsargument”

Wenn du mehrere Auto-Par-IDs angeben willst, würde ich eines von zwei Sachen anstelle von nargs='+' :

  1. Benutze die Option einmal pro ID ( mycommand --carpark 17 --carpark 18 )

     parser.add_argument('--carpark', dest='carpark_ids', type=int, action='append', default=[], help="One carpark ID (can be used multiple times)" ) 
  2. Nehmen Sie ein einziges, kommagetrenntes Argument statt ( mycommand --carpark 17,18 )

     parser.add_argument('--carpark', type=lambda s: map(int, s.split(",")), dest='carpark_ids', default=[], help="One or more carpark IDs" ) 

    Mit ein wenig mehr Arbeit, können Sie dies ändern, um mehrere Verwendungen von – --carpark zu sammeln alle seine Werte in einer einzigen Liste zu ermöglichen.

Eine dritte Alternative, die ich nicht besonders lieb habe, ist, das Positionsargument aufzugeben und es dann zu einem optionalen Argument zu machen. ( mycommand --carpark 17 18 --infile ~/path-to-file ).

 parser.add_argument('--infile', help="The file to be imported", type=argparse.FileType('r'), default=sys.stdin ) parser.add_argument('--carpark', nargs='+', dest='CarparkID', type=int, default=[], help="One or many carpark IDs" ) 

Funktioniert das?

 $ mycommand ~/path-to-file --carpark 17 

Es gibt einen Python-Bug / Problem über + Aktionen, die zu viele Argumente verbrauchen, so dass keine für folgende Aktionen.

Die Argumentzuweisung basiert auf Argumentzählungen, nicht auf type . Die type Funktion wird nach der Zuweisung angewendet, und es gibt keine Vorkehrungen für die Rückgabe von "abgelehnten" Argumenten.

In korrektem Verhalten sollte man berücksichtigen, dass infile ein Argument erwartet – und es gibt keine weiteren Fahnenschnüre – und reserviere also einen String zu dieser Aktion.

Ich könnte diesen Bug aussehen lassen, aber bis jetzt ist das Fix, die Argumente in einer anderen Reihenfolge zu liefern. Oder definieren Sie eine --infile Aktion (anstelle der Position).

Eine frühere Frage, mit dem Bug / Issue Link (meine Antwort konzentriert sich mehr auf immer die usage richtig).

Argparse – fehlt nicht mit "Nargs".

  • Wie bekomme ich argparse in Python 2.6?
  • Python argparse: Machen Sie mindestens ein Argument erforderlich
  • Bedingte Befehlszeilenargumente in Python mit Argparse
  • Ruby optparse Einschränkungen
  • Argparse argument bestellen
  • Ein optionales Argument, das keine Positionsargumente erfordert
  • Argparse - wie geht es zu einer Methode mit kwargs oder argv
  • Gibt es irgendeine Möglichkeit, argparse.ArgumentParser.parse_args () zu bekommen, um keine Argumentfehler zu beenden?
  • Python argparse Befehlszeilenflags ohne Argumente
  • Python-argparse-Toggle-Flaggen
  • Ändern des Metavarwertes in argparse nur in der Argumentliste und nicht in seiner Verwendung
  • Python ist die beste Programmiersprache der Welt.