2017-06-14 7 views
2

Wenn das Modul optparse verwendet wird, dann kann ich alle Standardwerte für alle Befehlszeilenargumente wie diese:Python: Wie alle Standardwerte erhalten, von argparse

import optparse 

if __name__ == '__main__': 
    parser = optparse.OptionParser(usage='pokus --help') 
    parser.add_option("-d", "--debug", action='store_true', dest="debug", 
         default=False, help='Enabling debugging.') 
    options, args = parser.parse_args() 
    print(parser.defaults) 

Da optparse ist veraltet es klug ist, neu zu schreiben Ihr Code argparse Modul zu verwenden. Allerdings kann ich keine Möglichkeit finden, wie alle Standardwerte aller Befehlszeilenargumente Parser-Objekt hinzugefügt erhalten:

import argparse 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(usage='pokus --help') 
    parser.add_argument("-d", "--debug", action='store_true', dest='debug', 
         default=False, help='Enabling debugging.') 
    args = parser.parse_args() 
    # <---- How to get default values for all arguments here? 
    # Not: vars(args) 

Ich möchte alle Standardwerte erhalten, wenn ich Programm laufen mit (./app.py -d) oder ohne Befehl Zeilenargument (./app.py).

+0

Die Standardwerte eingestellt sind, auf dem ' args' Objekt, wenn Schalter weggelassen werden. Müssen Sie für etwas anderes Zugang zu diesen haben? –

+1

In Ihrem Beispiel wird 'args.debug' auf' False' gesetzt, wenn Sie das Programm nicht mit '-d' ausführen. Was ist Ihr Anwendungsfall, wenn Sie wissen müssen, dass der Standardwert 'False' ist, wenn Sie mit' -d' arbeiten? –

+0

Haben Sie überlegt, ['docopt'] (http://docopt.org/) zu verwenden? – pylang

Antwort

2

Wenn Sie keinen Mangel tun eine leere Eingabestring zu analysieren, können Sie die Methode get_default im parser-Objekt verwenden:

import argparse 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(usage='pokus --help') 
    parser.add_argument("-d", "--debug", action='store_true', dest='debug', 
         default=False, help='Enabling debugging.') 
    args = parser.parse_args() 

    # To get a single default: 
    d_default = parser.get_default('d') 

    # To get all defaults: 
    all_defaults = {} 
    for key in vars(args): 
     all_defaults[key] = parser.get_default(key) 
+0

Danke für Ihre Antwort. Es scheint auch eine funktionierende Lösung zu sein. – JiriHnidek

3

gefunden Lösung:

import argparse 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(usage='pokus --help') 
    parser.add_argument("-d", "--debug", action='store_true', dest='debug', 
         default=False, help='Enabling debugging.') 
    parser.add_argument("-e", "--example", action='store', dest='example', 
         default="", help='Example of argument.') 
    # Arguments from command line and default values 
    args = vars(parser.parse_args()) 
    # Only default values 
    defaults = vars(parser.parse_args([])) 

Dann können Sie args und defaults Werte vergleichen und zwischen Standardwerten und Werten von der Kommandozeile unterscheiden.

1

Zu Ihrer Information, hier ist der Code, zu Beginn der Analyse, die die initialisiert defaults:

def parse_known_args(...): 
    .... 
    # add any action defaults that aren't present 
    for action in self._actions: 
     if action.dest is not SUPPRESS: 
      if not hasattr(namespace, action.dest): 
       if action.default is not SUPPRESS: 
        setattr(namespace, action.dest, action.default) 

    # add any parser defaults that aren't present 
    for dest in self._defaults: 
     if not hasattr(namespace, dest): 
      setattr(namespace, dest, self._defaults[dest]) 
    ... 

So Schleifen es durch die parser._actions Liste, Sammeln des action.default Attribut. (Ein action ist ein Action Klassenobjekt, das mit der Methode parser.add_argument erstellt wurde.). Es überprüft auch self._defaults. Dies ist das durch eine parse.set_defaults-Methode modifizierte Wörterbuch. Dies kann verwendet werden, um defaults festzulegen, die nicht direkt mit einer Aktion verknüpft sind.

Nachdem die Befehlszeile Parsen Standardzeichenfolgen in dem Namensraum ausgewertet werden können (mit den action.type), Drehen, beispielsweise ein default='1' in eine ganzen Zahl 1.

Handhabung von Ausfällen in argparse ist nicht trivial. Ihr parse_args([]) ist wahrscheinlich am einfachsten, sofern der Parser damit einverstanden ist (d. H. Keine erforderlichen Argumente hat).

Ich weiß nicht, jetzt optparse setzt das defaults Attribut. Es gibt eine Nicht-Trival-Methode, optparse.OptionParser.get_default_values.

0

Für das obige Beispiel:

import argparse 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(usage='pokus --help') 
    parser.add_argument("-d", "--debug", action='store_true', dest='debug', 
        default=False, help='Enabling debugging.') 

A. Um alle Werte mit ihren Standardeinstellungen in einem tuple Format zu erhalten:

In[1]: args = parser.parse_known_args()[0] 
In[2]: args._get_kwargs() 
Out[1]: [('debug', False)] 

jedem Artikel zuzugreifen:

In[3]: args.debug 
Out[2]: False 

B. Um

In[4]: dict_args = parser.parse_known_args()[0].__dict__ 
In[5]: dict_args 
Out[3]: {'debug': False} 

die Werte und ihren Standard als dictionary Format zu erhalten und jeden Schlüssel zuzugreifen:

In[6]: dict_args['debug'] 
Out[4]: False 

Oder sie iterativ drucken:

In[7]: for key in dict_args: 
...  print('value for %s is: %s'% (key, dict_args[key])) 

Out[5]: value for debug is: False