第十四章:应用构建模块-argparse:命令行选项和参数解析-高级参数处理-定制动作

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。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43193719/article/details/93296805