14.1.7.4 定制动作
除了前面描述的内置动作之外,还可以提供一个实现了Action API的对象来定义定制动作。作为动作(action)传入add_argument()的对象有一些形参描述所定义的参数(为add_argument()指定的所有参数),并返回一个可调用对象,它的形参包括parser(用来处理参数),namespace(包含解析操作),value(所处理参数的值),以及触发动作的option_string。
已经提供了类Action,可以把它作为定义新动作的一个很方便的起点。构造函数处理参数定义,所以只需要在子类中覆盖__call__()。
import argparse
class CustomAction(argparse.Action):
def __init__(self,
option_strings,
dest,
nargs=None,
const=None,
default=None,
type=None,
choices=None,
required=False,
help=None,
metavar=None):
argparse.Action.__init__(self,
option_strings=option_strings,
dest=dest,
nargs=nargs,
const=const,
default=default,
type=type,
choices=choices,
required=required,
help=help,
metavar=metavar,
)
print('Initializing CustomAction')
for name,value in sorted(locals().items()):
if name == 'self' or value is None:
continue
print(' {} = {!r}'.format(name,value))
print()
return
def __call__(self,parser,namespace,values,option_string=None):
print('Processing CustomAction for {}'.format(self.dest))
print(' parser = {}'.format(id(parser)))
print(' values = {!r}'.format(values))
print(' option_string = {!r}'.format(option_string))
# Do some arbitrary processing of the input values.
if isinstance(values,list):
values = [v.upper() for v in values]
else:
values = values.upper()
# Save the results in the namespace using the destination
# variable given to our constructor.
setattr(namespace,self.dest,values)
print()
parser = argparse.ArgumentParser()
parser.add_argument('-a',action=CustomAction)
parser.add_argument('-m',nargs='*',action=CustomAction)
results = parser.parse_args(['-a','value',
'-m','multivalue',
'second'])
print(results)
values的类型取决于nargs的值。如果参数允许多个值,那么values就是一个列表(即使其中只包含一项)。
option_string的值也取决于最初的参数规范。对于必要的位置参数,option_string总是None。