2017-05-10 6 views
1

Statt eine Reihe von Literalen über Anrufe zu add_argument von mit verstreut, etwa so:Kann ich ein Objekt in argparse.add_argument übergeben?

parser.add_argument('--foo', 
        required=False, 
        metavar='bar', 
        type=str, 
        help='help message', 
        default='default') 

parser.add_argument('--foo2', 
        required=False, 
        metavar='bar2', 
        type=str, 
        help='help message', 
        default='default') 

Ich hatte gehofft, dass ich zum ersten Mal einen Behälter schaffen könnte, und dann alle Argumente in einer Schleife hinzuzufügen.
Etwas wie folgt aus:

for arg in argument_container: 
    parser.add_argument(arg) 

ich nicht vertraut genug bin mit, wie Python diese Parameter akzeptiert verstehen, wenn sie wörtliche in eine Art von Objekt abstrahiert werden kann, wie ich will.

Gibt es eine Möglichkeit, alle Parameter zuerst in einen Container zu extrahieren und dann alle Argumente auf einmal durch eine Schleife wie oben gezeigt hinzuzufügen?

+0

Haben Sie versucht, es zu tun? – JohanL

+0

Ich habe versucht, ein Wörterbuch zu übergeben, das funktioniert nicht. Ich habe versucht, eine Art Objektliteral als benanntes Tupel zu erstellen, das nicht funktioniert hat. Ich habe mir die Implementierung von add_argument angeschaut, bin aber immer noch nicht sicher, was in die Funktion aufgenommen werden kann. –

Antwort

1

Viele der add_argument Parameter sind Schlüsselwörter, die über die **kwargs Syntax übergeben werden können. Zum Beispiel:

In [90]: parser=argparse.ArgumentParser() 
In [91]: adict={"metavar":"bar", "help":"help message", "default":"default"} 
In [92]: a1 = parser.add_argument('--foo', **adict) 
In [93]: a1 
Out[93]: _StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default='default', type=None, choices=None, help='help message', metavar='bar') 

In [94]: parser.print_help() 
usage: ipython3 [-h] [--foo bar] 

optional arguments: 
    -h, --help show this help message and exit 
    --foo bar help message 

Hier habe ich ein kleines Wörterbuch mit einigen der Parameter, und übergeben diejenigen über **adict in.

Ich habe "-foo" nicht in dieses Wörterbuch aufgenommen, weil es ein Positionsparameter ist. Dies könnte immer noch einer Variablen zugewiesen und auf diese Weise übergeben werden.

Ich speicherte einen Verweis auf das Objekt, das von add_argument zurückgegeben wird, und zeigte das an. Es zeigt, wie die meisten Parameter zu Attributen des resultierenden Action Objekts werden.


Für Ihr zweites Argument:

In [95]: dest = "--foo2" 
In [96]: adict={"metavar":"bar2", "help":"help message2", "default":"default2"} 
In [97]: a2 = parser.add_argument(dest, **adict) 
In [98]: 
In [98]: parser.print_help() 
usage: ipython3 [-h] [--foo bar] [--foo2 bar2] 

optional arguments: 
    -h, --help show this help message and exit 
    --foo bar help message 
    --foo2 bar2 help message2 

Offensichtlich ist dies verallgemeinert werden könnte mit Listen von Wörterbuch zu arbeiten, oder mit einer Funktion, die einige Parameter nimmt, erzeugt fehlende Einsen und rufe add_argument auf diese Weise.

+0

Danke. Ich habe das Wörterbuch nicht weitergegeben, als ich es weitergegeben habe. –

2

Um sowohl die *args und **kwargs in der gleichen Liste, können Sie sie als Teile eines Tupel hinzu:

import argparse 

parser = argparse.ArgumentParser(description='Process some strings.') 

args = [(('--foo', '-f'), {'help':'Foo help', 'required':False, 'type':str, 'default':'foo'}), 
     (('--bar', '-b'), {'help':'Bar help', 'required':False, 'type':str, 'default':'bar'})] 

for arg in args: 
    parser.add_argument(*arg[0], **arg[1]) 

parsed_args = parser.parse_args() 

Somit des Tupels erste Teil ist ein weiteres Tupel, die verschiedenen Namen der umschließende Argument, dann ist der zweite Teil des (äußeren) Tupels ein Diktat mit den Schlüsselwortargumenten.

Verwandte Themen