You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:25:15