使用 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 接受字典作为参数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python argparse 的字典

使用 argparse 接受更多参数

将 Python argparse.Namespace() 视为字典的正确方法是啥?

Python argparse 字典 arg

为啥 argparse 不接受参数并打印新的“魔术”用法?

帮助文本中的 Python argparse 参数顺序