Python argparse 模块 hook 输入参数的几种方式
Contents
需求描述:
用户输入size参数值,如果未给定单位,需要指定默认的size单位。
最初代码如下:
|
|
运行此程序:
|
|
下面使用三种方式来实现对size进行默认单位设置:
- 在获取完size之后修改
- 使用 自定义的store action对象
- 使用 自定义的Type方法
在获取完size之后修改
这种方式不在argparse中改变参数值,而是参数经过argparse解析之后,再判断并添加对应的参数。
|
|
执行结果:
|
|
使用自定义的store action对象
在argparse模块中,提供了各种 action 动作,作用是将输入的参数,按照不同的动作做对应的转换。
模块中提供了多个 action 对象,在初始化 ArgumentParser 对象时,会注册对应的动作对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
# ArgumentParser对象继承_ActionsContainer class _ActionsContainer(object): def __init__(self, description, prefix_chars, argument_default, conflict_handler): super(_ActionsContainer, self).__init__() ... # set up registries self._registries = {} # register actions self.register('action', None, _StoreAction) self.register('action', 'store', _StoreAction) self.register('action', 'store_const', _StoreConstAction) self.register('action', 'store_true', _StoreTrueAction) self.register('action', 'store_false', _StoreFalseAction) self.register('action', 'append', _AppendAction) self.register('action', 'append_const', _AppendConstAction) self.register('action', 'count', _CountAction) self.register('action', 'help', _HelpAction) self.register('action', 'version', _VersionAction) self.register('action', 'parsers', _SubParsersAction) self.register('action', 'extend', _ExtendAction) ...
在 add_argument 方法中,指定 action参数,输入的参数将使用指定的动作进行转换。例如,指定
action="count"
,输入参数后,将按照 _CountAction 实现的 call 方法进行转化。1 2 3 4 5 6 7 8 9 10 11 12
class ArgumentParser(_AttributeHolder, _ActionsContainer): ... def _parse_known_args(self, arg_strings, namespace): ... def take_action(action, argument_strings, option_string=None): ... # take the action if we didn't receive a SUPPRESS value # (e.g. from a default) if argument_values is not SUPPRESS: action(self, namespace, argument_values, option_string)
可以使用自定义的 action对象 替换模块中的默认动作对象。在 add_argument 方法中,指定 action参数 为自定义的 action对象 即可。模块在处理时,如果发现传入的 action参数 未被注册,并且是能够被调用的,则将初始化自定义的action对象。
1 2 3 4 5 6 7 8 9 10 11 12
def _pop_action_class(self, kwargs, default=None): action = kwargs.pop('action', default) return self._registry_get('action', action, action) def add_argument(self, *args, **kwargs): ... # create the action object, and add it to the parser action_class = self._pop_action_class(kwargs) if not callable(action_class): raise ValueError('unknown action "%s"' % (action_class,)) action = action_class(**kwargs)
自定义 action对象 只需要按照要求实现 init 和 call 方法即可。在本例子中,继承模块中的 _StoreAction类,只需修改对应的 call 方法即可。
|
|
执行结果:
|
|
使用自定义的Type方法
argparse模块,在处理参数时,如果在 add_argument方法中指定了type参数,将会按照type参数指定的类型进行参数转换
|
|
利用第一种方式中的转换方法,修改代码如下:
|
|
执行结果:
|
|