如何将 kwargs 传递给 argparse

How to pass kwargs to argparse

我需要通过命令行将字典传递给 python 模块。我还没有找到让 Python 合作的方法。以下是我想要完成的一个非常简单的示例。这会产生以下错误 TypeError: _get_positional_kwargs() missing 1 required positional argument: 'dest' 。将 dest 参数添加到 add_argument 行会导致 TypeError: __init__() got an unexpected keyword argument 'kwargs',这表明 argparse 可能根本不将字典作为参数的可悲可能性。 pickle 文件真的是从命令行调用来回传递字典的唯一选择吗?

def run(**kwargs):
for i in kwargs.items():
    print(f'{i}: {kwargs[i]}')
# ...some code to manipulate the dictionary
return kwargs


if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="Test script")
parser.add_argument(kwargs='**', description='A dictionary to be manipulated and returned')
args = parser.parse_args()
x = run(args)
pass

附加信息 - 我知道我可以使用包含 space 分隔参数的命令行将列表传递给 *nargs 参数,但是我需要用字典做类似的事情。

更新 - 有效的内容: 基于@chepner 的有用输入,我能够使用他在回答中提到的 json 解决方案。在我的 Windows 平台上,我确实必须从字典字符串中删除所有 space,并且在最终的命令行字符串中需要转义字符。

{\"this\":1,\"is\":2,\"a\":5,\"dictionary\":7}

参数是字符串,句点。您要传递的是一个包含 编码的 dict 的字符串,例如使用 JSON.

import argparse
import json


parser = argparse.ArgumentParser()
parser.add_argument('data', type=json.loads)

args = parser.parse_args()

如果您 运行 您的脚本带有

myscript '{"foo": 3, "bar": "hello"}'

然后 args.data["foo"] == 3args.data["bar"] == "hello"