使用 argparse 和 python 接受字典作为参数 [重复]
Posted
技术标签:
【中文标题】使用 argparse 和 python 接受字典作为参数 [重复]【英文标题】:Accepting a dictionary as an argument with argparse and python [duplicate] 【发布时间】:2013-09-07 15:55:49 【问题描述】:我正在尝试使用 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操作符的对象都可以作为choices值传递,所以dict对象、set对象、自定义容器等都支持。”
【问题讨论】:
您从文档中引用的行与“choices”关键字参数有关,它定义了允许的参数值。将 dict 传递给选择实际上等效于传递键列表。因此,传递“ 'a':2, 'b':3 ” 会将“--mydict”标志的允许参数限制为“a”或“b”。 【参考方案1】:我认为不可能在命令行中将字典作为参数传递,因为不存在从字符串到字典的转换函数(编辑:黑客是 可能会给出类似的行为,见下文)。您实际上是在告诉 python 做的是:
dict("'key1': 'value1'")
如果你在 python 控制台中尝试,它不起作用。
什么短语:
“任何支持in操作符的对象都可以作为choices值传递,所以dict对象、set对象、自定义容器等都支持。”
指的是可以与 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)
然后您可以以字符串的形式传递字典。您可以在 python 控制台中自己尝试 json 编码器/解码器,看看它是如何工作的:
>>>json.loads('"value1":"key1"')
u'value1': u'key1'
EDIT:hpaulj 向我指出,您可以通过传递 json.loads 参数来“破解”type 参数,这允许您将类似于字典的 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)
这也意味着您可以传递任何将单个参数作为参数的函数,以便在需要时进行类型和执行自定义转换:)
【讨论】:
type=json.loads
工作
这实际上很有意义,因为正如我上面提到的,传递给 type 的参数是通过将参数放在括号中来处理的。感谢您指出这一点。
我不一定会称之为“黑客”。这实际上是 type 参数应该如何工作
显然 jason 可以在字典 '"value1":"key1"' 中使用单引号和双引号进行解码,但不能使用 "'value1':'key1'"
在windows中,在终端中传递-m \"key1\":\"value1\"
。(在"
前面加上反斜杠\
,整个
字符串中没有空格)。以上是关于使用 argparse 和 python 接受字典作为参数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章