Un module argparse pratique pour obtenir des arguments en Python.
Si vous spécifiez une action dans add_argument, vous pouvez définir comment stocker la valeur en cas d'argument.
Le plus couramment utilisé est peut-être de spécifier store_true
et de l'utiliser simplement pour marquer.
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument("--hoge", action="store_true")
>>> args = parser.parse_args(["--hoge"])
>>> args.hoge
True
Donc, si vous passez un objet qui implémente l'API à cette action, vous pouvez effectuer toutes les préparations, j'ai donc essayé de l'utiliser.
argparse.Action
Ecrivez une classe qui hérite de ʻargparse.Action et a une méthode
call` selon la documentation argparse.
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)
La méthode __call__
doit recevoir les quatre arguments suivants.
--parser
: objet ArgumentParser add_argument
--space
: objet d'espace de noms retourné par parse_args ()
--values
: valeurs d'argument. Si le type de add_argument est spécifié, le type est converti en premier.
--ʻOption_string`: Chaîne d'option lorsqu'il s'agit d'un argument d'option. Non passé s'il s'agit d'un argument positionnel.
Essayez d'utiliser la PrintAction
ci-dessus.
>>> 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'
Fondamentalement, après avoir traité correctement les valeurs, vous pouvez l'ajouter à l'espace de noms en utilisant le nom de l'argument («self.dest») comme nom d'attribut.
[écrit](https) "doit accepter deux arguments de position et tous les arguments de mot-clé passés à ArgumentParser.add_argument () sauf l'action elle-même." (: //docs.python.jp/3/library/argparse.html#action-classes), en bref, semble pouvoir vérifier dans
init si l'utilisation de l'action dans ʻadd_argument
est appropriée.Prenez un entier ou <int> [KMG]
comme argument, et dans ce dernier cas convertissez-le en un entier ʻaction`.
calc_suffix_action.py
import argparse
class CalcSuffixAction(argparse.Action):
def __init__(self, option_strings, dest, nargs=None, **kwargs):
"""
Optionnel.`add_argument`Ici si vous voulez déterminer si les autres arguments sont appropriés pour l'action
Cette fois`__call__`Recevoir en méthode`values`Parce que je pense que ce n'est pas une liste
`nargs`Essayez de limiter.
"""
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)
Je vais essayer.
>>> 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