2014-04-17 9 views
5

Ich habe eine Reihe von Python-Skripten, die gemeinsamen Code zum Lesen von Eingabe und Schreiben von Ausgabedateien verschiedener Typen verwenden.ArgParse Python-Modul: Ändern Standard-Argument-Wert für inherted Argument

Dies sind chemische Strukturdateien. Einige Beispieldateitypen wären .smi oder .sdf.

Standardmäßig möchte ich, dass einige dieser Skripts Daten im Dateiformat "smi" ausgeben und andere Daten im Format "sdf" ausgeben.

Kann der Standardwert eines von einem Parser geerbten Arguments überschrieben werden?

Zum Beispiel ...

# Inherited code 
filesParser = argparse.ArgumentParser(add_help=False) 
filesParser.add_argument('-o', dest='outformat', default="smi") 

# Script code 
parser = argparse.ArgumentParser(description='inherts from filesParser', parents=[filesParser]) 
parser.add_argument('--foo') 

# Something like... 
# parser.outformat.default = "sdf" 

args = parser.parse_args() 

Erster Beitrag so hofft, meine Etikette in Ordnung ist.

Vielen Dank, Dave

Antwort

5

Ja (docs):

>>> parser.parse_args([]) 
Namespace(foo=None, outformat='smi') 
>>> parser.set_defaults(outformat='sdf') 
>>> parser.parse_args([]) 
Namespace(foo=None, outformat='sdf') 
+0

Vielen Dank! Ich sah mich eine Weile um und entdeckte es nicht. – user3544841

2

set_defaults ist wahrscheinlich die einfachste Lösung.

Aber ich denke, dass es sich lohnt, zu wissen, dass Sie die Standard einer Aktion direkt

filesParser = argparse.ArgumentParser(add_help=False) 
outaction=filesParser.add_argument('-o', dest='outformat', default="smi") 
parser = argparse.ArgumentParser(description='inherts from filesParser', parents=[filesParser]) 
fooaction=parser.add_argument('--foo') 
print fooaction.default 
# None 
print outaction.default 
# 'smi' 
outaction.default='sdf' 
args=parser.parse_args() 
print args 
# Namespace(foo=None, outformat='sdf') 

add_argument gibt ein Action Objekt ändern kann, die alle Informationen enthält, die Sie in den Argumenten angegeben. Hier speichere ich (Links zu) diese Aktionen in den Variablen outaction und fooaction. outaction.default ist der Standardwert, der parse_args verwendet.

Mit Ihrem geerbten Code ist es wahrscheinlich umständlich, den outaction Link zu speichern (obwohl es in der 'parser._actions' Liste zu finden ist). Es macht also Sinn, set_defaults die Arbeit für Sie erledigen zu lassen.

Der Code für set_defaults kann aufschlussreich sein:

def set_defaults(self, **kwargs): 
    self._defaults.update(kwargs) 

    # if these defaults match any existing arguments, replace 
    # the previous default on the object with the new one 
    for action in self._actions: 
     if action.dest in kwargs: 
      action.default = kwargs[action.dest] 

Zuerst legt es die neuen Standardeinstellungen im parser._defaults Wörterbuch, und dann ändert es bedingt das action.default Attribut (beachten Sie die Suche nach parser._actions). Es muss beides tun, denn wenn es Zeit ist, die Standardwerte zu verwenden, hat der action.default Wert Vorrang vor dem parser._defaults Wert.

Diese Details sind sinnvoller, wenn Sie diesen Code in einer interaktiven Shell (z. B. Ipython) ausführen und die Objekte action und parser drucken können. Die üblichen Vorsichtsmaßnahmen beim Spielen mit 'privaten' Attributen treffen zu.