如何通过Python argparse让--new-entry参数处理空格分隔键值对序列
实现方案
argparse本身没有直接支持这种“单参数接收空格分隔键值对”的功能,但可以通过自定义逻辑实现,也可以用第三方库简化开发。
方法一:argparse + 手动解析键值对
给--new-entry参数设置nargs='+',让它捕获所有后续的键值对参数,之后手动将这些键值对转换为字典:
import argparse def parse_key_value_pairs(pairs): entry_dict = {} for pair in pairs: # 按第一个等号拆分,避免值里包含等号的情况 key, value = pair.split('=', 1) # 去除值首尾的引号(如果有) if (value.startswith(('"', "'")) and value.endswith(('"', "'"))): value = value[1:-1] entry_dict[key] = value return entry_dict parser = argparse.ArgumentParser() parser.add_argument('--new-entry', nargs='+', help='输入格式为 key="value" 的键值对序列') args = parser.parse_args() if args.new_entry: entry_dict = parse_key_value_pairs(args.new_entry) print(entry_dict)
测试命令:
python script.py --new-entry name="The Republic" author="Plato" year="-400"
输出结果:
{'name': 'The Republic', 'author': 'Plato', 'year': '-400'}
方法二:自定义argparse Action(更优雅)
通过继承argparse.Action,可以在参数解析阶段直接把键值对转换成字典,无需额外处理:
import argparse class KeyValuePairsAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): entry_dict = {} for pair in values: key, value = pair.split('=', 1) if (value.startswith(('"', "'")) and value.endswith(('"', "'"))): value = value[1:-1] entry_dict[key] = value setattr(namespace, self.dest, entry_dict) parser = argparse.ArgumentParser() parser.add_argument('--new-entry', nargs='+', action=KeyValuePairsAction, help='输入格式为 key="value" 的键值对序列') args = parser.parse_args() # 直接使用转换后的字典 print(args.new_entry)
方法三:用第三方库Click简化开发
如果不想自己写解析逻辑,可以用Click库(需要先通过pip install click安装),它的回调功能可以轻松实现需求:
import click def parse_key_values(ctx, param, values): entry_dict = {} for pair in values: key, value = pair.split('=', 1) if (value.startswith(('"', "'")) and value.endswith(('"', "'"))): value = value[1:-1] entry_dict[key] = value return entry_dict @click.command() @click.option('--new-entry', nargs=-1, callback=parse_key_values, help='输入格式为 key="value" 的键值对序列') def main(new_entry): print(new_entry) if __name__ == '__main__': main()
执行同样的测试命令,即可直接得到字典格式的结果。
内容的提问来源于stack exchange,提问作者fauve
相关产品推荐
相关产品推荐

