我想让
--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 或任何其他库中是否有这样的功能?
这是一种方法:创建自定义操作。
#!/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
已定义(如果没有,则定义它)。