Python argparse 的键值“子参数”

问题描述 投票:0回答:1

我想让

--new-entry
参数能够处理以空格作为语句分隔符的键值序列。

例如:

script.py --new-entry name="The Republic" author="Plato" year="-400"

在此示例中,

name="The Republic" author="Plato" year="-400"
是参数
--new-entry
的整个值。理想情况下,我想将它放入字典中,例如:

    {
        "name": "The Republic",
        "author": "Plato",
        …
    }

我没有搜索要做的事情

我并没有尝试使用多个参数来获取不同的值,而不是某些人在其他地方搜索的内容。所有需要的变量(姓名、作者、年份)应在一个参数内检索

问题

那么,它们在 argparse 或任何其他库中是否有这样的功能?

python parameter-passing argparse key-value
1个回答
0
投票

这是一种方法:创建自定义操作。

#!/usr/bin/env python3
import argparse
import contextlib
import json


class JsonKeyValueAction(argparse.Action):
    """
    Parses command-line key=value pairs, then attempt to JSON decode the values
    """

    @staticmethod
    def _parse_key_value(key_value):
        key, value = key_value.split("=", 1)
        with contextlib.suppress(json.decoder.JSONDecodeError):
            value = json.loads(value)
        return key, value

    def __call__(self, parser, namespace, values, option_string=None):
        dict_object = getattr(namespace, self.dest) or {}
        setattr(namespace, self.dest, dict_object)
        dict_object.update(self._parse_key_value(kv) for kv in values)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-n", "--new-entry", nargs="*", action=JsonKeyValueAction, default={}
    )
    options = parser.parse_args()
    print(options.new_entry)

调用示例:

$ ./script.py --new-entry name="The Republic" author="Plato" year="-400"
{'name': 'The Republic', 'author': 'Plato', 'year': -400}

注释

  • 方法
    _parse_key_value
    会将此类文本解析为 'name="The Republic"' 并返回 ('name', 'The Republic')。请注意,它使用
    json.loads()
    函数来解析该值。这意味着它可以解析字符串、整数、布尔值、列表、字典……
    json
    可以解析的东西。
  • __call__()
    方法中的前两行确保属性
    new_entry
    已定义(如果没有,则定义它)。
© www.soinside.com 2019 - 2024. All rights reserved.