如何在argparse的append动作中直接将结果转换为字典?
如何在argparse的append动作中直接将结果转换为字典?
我懂你这种想省掉事后处理步骤的心情——毕竟能在解析阶段搞定的事,谁想多写一行转换代码呢?刚好可以用自定义argparse动作来实现这个需求,不用再手动转字典了,给你具体的实现方式:
首先,我们可以自定义一个继承自argparse.Action的类,在这个类里处理参数的逻辑,把每次传入的键值对直接塞进字典里:
import argparse class EnvDictAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): # 先检查目标属性是否存在,不存在就初始化一个空字典 if not hasattr(namespace, self.dest) or getattr(namespace, self.dest) is None: setattr(namespace, self.dest, {}) # 把当前传入的键值对添加到字典中 env_dict = getattr(namespace, self.dest) env_dict[values[0]] = values[1]
接下来,在添加参数的时候,把action参数指定为我们刚才定义的EnvDictAction,替换原来的action='append':
ap = argparse.ArgumentParser() ap.add_argument('-e', '--env', action=EnvDictAction, nargs=2, metavar=('NAME', 'VALUE'), dest='extra_env', help='set some env var to given value')
现在来测试一下效果,完全不用事后处理了:
args = ap.parse_args(['-e', 'SOMEENVVAR', 'SOMEVAL', '--env', 'OTHERENVVAR', 'OTHERVAL']) print(args.extra_env) # 输出就是现成的字典:{'SOMEENVVAR': 'SOMEVAL', 'OTHERENVVAR': 'OTHERVAL'}
至于你之前想尝试的type参数,确实不太适合这个场景——因为type是用来处理单个参数值的转换逻辑,而这里我们每次传入的是一组(两个)值,再加上要实现类似append的多次添加逻辑,自定义动作才是更贴合需求的方案。
对比你原来的事后处理方式,这种自定义动作的好处是把参数解析和格式转换的逻辑整合在了一起,代码逻辑更内聚,也更符合argparse的设计思路。
备注:内容来源于stack exchange,提问作者murison
相关产品推荐
相关产品推荐

