Ein praktisches Argparse-Modul zum Abrufen von Argumenten in Python. Wenn Sie in add_argument eine Aktion angeben, können Sie festlegen, wie der Wert gespeichert werden soll, wenn ein Argument vorhanden ist. Vielleicht wird am häufigsten "store_true" angegeben und einfach zum Markieren verwendet.
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument("--hoge", action="store_true")
>>> args = parser.parse_args(["--hoge"])
>>> args.hoge
True
Wenn Sie also ein Objekt übergeben, das die API für diese Aktion implementiert, können Sie alle Vorbereitungen treffen, also habe ich versucht, es zu verwenden.
argparse.Action
Schreiben Sie eine Klasse, die argparse.Action
erbt und eine __call__
-Methode gemäß argparse-Dokumentation hat.
print_action.py
import argparse
class PrintAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
print "[{}] option add value [{}] as attr [{}]".format(
option_string, values, self.dest)
setattr(namespace, self.dest, values)
Die Methode call sollte die folgenden vier Argumente erhalten.
--parser
: add_argument ArgumentParser-Objekt
--space
: Namespace-Objekt, das von parse_args () zurückgegeben wird
--Werte
: Argumentwerte. Wenn der Typ von add_argument angegeben ist, wird der Typ zuerst konvertiert.
--option_string
: Optionszeichenfolge, wenn es sich um ein Optionsargument handelt. Nicht für Positionsargumente übergeben.
Versuchen Sie es mit der obigen "PrintAction".
>>> import argparse
>>> from print_action import PrintAction
>>>
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument("--hoge", action=PrintAction)
>>> args = parser.parse_args("--hoge huga".split(' '))
[--hoge] option add value [huga] as attr [hoge]
>>> args.hoge
'huga'
Grundsätzlich können Sie "Werte" nach entsprechender Verarbeitung zum "Namespace" hinzufügen, indem Sie den Argumentnamen ("self.dest") als Attributnamen verwenden.
argparse.Action .__ init__
schreibt:" Muss zwei Positionsargumente und alle an ArgumentParser.add_argument () übergebenen Schlüsselwortargumente akzeptieren, mit Ausnahme der Aktion selbst. " (: //docs.python.jp/3/library/argparse.html#action-classes) scheint in der Lage zu sein, in "init" zu überprüfen, ob die Verwendung der Aktion in "add_argument" angemessen ist.Nehmen Sie eine Ganzzahl oder "
calc_suffix_action.py
import argparse
class CalcSuffixAction(argparse.Action):
def __init__(self, option_strings, dest, nargs=None, **kwargs):
"""
Optional.`add_argument`Hier, wenn Sie feststellen möchten, ob die anderen Argumente für eine Aktion geeignet sind
Diesmal`__call__`In Methode empfangen`values`Weil ich erwarte, dass das keine Liste ist
`nargs`Versuchen Sie zu begrenzen.
"""
if nargs is not None and nargs != '?':
raise ValueError("Invalid `nargs`: multiple arguments not allowed")
super(CalcSuffixAction, self).__init__(option_strings, dest, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
try:
if values.endswith('K'):
digit = int(values[:-1]) * 1000
elif values.endswith('M'):
digit = int(values[:-1]) * 1000000
elif values.endswith('G'):
digit = int(values[:-1]) * 1000000000
elif not isinstance(values, int):
digit = int(values)
else:
digit = values
except ValueError:
parser.error("Invalid argument ({})".format(values))
setattr(namespace, self.dest, digit)
Ich werde es versuchen.
>>> import argparse
>>> from calc_suffix_action import CalcSuffixAction
>>>
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument("--hoge", action=CalcSuffixAction)
>>>
>>> parser.parse_args("--hoge 1024".split(' '))
Namespace(hoge=1024)
>>> parser.parse_args("--hoge 4K".split(' '))
Namespace(hoge=4000)
>>> parser.parse_args("--hoge 32M".split(' '))
Namespace(hoge=32000000)
>>> parser.parse_args("--hoge 1G".split(' '))
Namespace(hoge=1000000000)
>>> parser.parse_args("--hoge 3T".split(' '))
usage: [-h] [--hoge HOGE]
: error: Invalid argument (3T)
Recommended Posts