57

我正在尝试使用 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

这就是我尝试将字典传递给脚本时发生的情况

./argp.py -m "{'key1': 'value1'}"
usage: argp.py [-h] [-m MYDICT]
argp.py: error: argument -m/--mydict: invalid dict value: "{'key1': 'value1'}"

看着文件,我认为这是可能的。

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

“任何支持 in 运算符的对象都可以作为选择值传递,所以 dict 对象、set 对象、自定义容器等都支持。”</p>

4

1 回答 1

78

我认为不可能在命令行中将字典作为参数传递,因为不存在从字符串到 dict 的转换函数(编辑:可能会出现类似行为的 hack,见下文。你本质上告诉python要做的是:

dict("{'key1': 'value1'}")

如果您在 python 控制台中尝试它,它不起作用。

什么成语:

“任何支持 in 运算符的对象都可以作为选择值传递,因此 dict 对象、set 对象、自定义容器等都受支持。”

指的是可以使用add_argument函数传递的选择参数 - 而不是类型参数。

您最好的选择是可能接受您的参数作为字符串,然后使用python的json功能对其进行转换:

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

import json
my_dictionary = json.loads(args.my_dict)

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

>>>json.loads('{"value1":"key1"}')
{u'value1': u'key1'}

编辑: hpaulj 向我指出,您可以通过传递json.loads来“破解”类型参数,它允许您传递类似于字典的 JSON。

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

mydict = args.my_dict  # Will return a dictionary

注意:您传递输入格式与 python 字典不同,但对于您的用例来说可能足够相似。

这样做的原因实际上很有趣,因为在内部 argparse 只会使用参数值作为函数来转换参数。即如果 type=int 那么它将使用 int(arg) 或者如果 type=json.loads 然后 json.loads(arg)

这也意味着您可以传递任何将单个参数作为参数的函数,以在需要时输入并执行自定义转换:)

于 2013-09-04T08:52:23.810 回答