使用argparse和python接受字典作为参数

use*_*896 43 python dictionary argparse

我试图接受带有argparse的type = dict的参数,但无论输入它是否给出了无效dict值的错误.

#!/usr/bin/env python

import argparse

MYDICT = {'key': 'value'}

parser = argparse.ArgumentParser()
parser.add_argument("-m", "--mydict", action="store",
                    required=False, type=dict,
                    default=MYDICT)

args = parser.parse_args()

print args.mydict
Run Code Online (Sandbox Code Playgroud)

当我尝试将字典传递给脚本时会发生这种情况

./argp.py -m "{'key1': 'value1'}"
usage: argp.py [-h] [-m MYDICT]
argp.py: error: argument -m/--mydict: invalid dict value: "{'key1': 'value1'}"
Run Code Online (Sandbox Code Playgroud)

看看这些文件,我认为这是可能的.

http://docs.python.org/dev/library/argparse.html

"支持in运算符的任何对象都可以作为选项值传递,因此支持dict对象,设置对象,自定义容器等."

Mic*_*ina 59

我不认为在命令行中传递字典作为参数是不可能的,因为不存在从字符串到字典的转换函数(编辑:可能黑客攻击,见下文).你基本上告诉python要做的是:

dict("{'key1': 'value1'}")
Run Code Online (Sandbox Code Playgroud)

如果你在python控制台中试用它,哪个不起作用.

这句话是什么:

"支持in运算符的任何对象都可以作为选项值传递,因此支持dict对象,设置对象,自定义容器等."

是指可以使用add_argument函数传递的choices参数- 而不是type参数.

你最好的选择是接受你的参数作为字符串然后使用python 的json功能转换它:

parser.add_argument('-m', '--my-dict', type=str)
args = parser.parse_args()

import json
my_dictionary = json.loads(args.my_dict)
Run Code Online (Sandbox Code Playgroud)

然后,您可以以字符串的形式传递字典.您可以在python控制台中自行尝试json编码器/解码器,看看它是如何工作的:

>>>json.loads('{"value1":"key1"}')
{u'value1': u'key1'}
Run Code Online (Sandbox Code Playgroud)

编辑:hpaulj向我指出,你可以通过传递json.loads来"破解" 类型参数.

import json
parser.add_argument('-d', '--my-dict', type=json.loads)
args = parse.parse_args()

mydict = args.my_dict  # Will return a dictionary
Run Code Online (Sandbox Code Playgroud)

这个工作的原因实际上非常有趣,因为内部argparse只会使用参数值作为转换参数的函数.即如果type = int则它将使用int(arg)或者如果type = json.loads则使用json.loads(arg)

这也意味着您可以传递任何带有单个参数的函数作为参数来键入并执行自定义转换,如果您需要:)

  • `type = json.loads`有效 (41认同)
  • 显然 jason 可以在 dict '{"value1":"key1"}' 但不是 "{'value1':'key1'}" 之外用单引号和双引号解码 (6认同)
  • 在 Windows 中,在终端中传递 ``-m {\"key1\":\"value1\"}`` (在 ``"`` 前面添加反斜杠 ``\``,整个 ` 中没有空格) `{}`` 字符串)。 (3认同)
  • 我不一定会称其为“ hack”。实际上就是类型参数应该如何工作 (2认同)