当前位置: 首页 > 面试题库 >

用argparse和python接受字典作为自变量

岳硕
2023-03-14
问题内容

我正在尝试使用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运算符的对象都可以作为options值传递,因此dict对象,set对象,自定义容器等都受支持。”


问题答案:

我不认为这是可能通过字典作为命令行参数,因为不从字符串存在一个转换功能的dict( 编辑 :黑客攻击
可能的,见下文)。您实质上要告诉python要做的是:

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

如果您在python控制台中尝试了该方法,将无法正常工作。

什么短语:

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

指的是可以通过 add_argument* 函数传递的 choices 参数,而不是 类型 参数。 ***

最好的选择是接受您的参数作为字符串,然后使用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 来“破解” 类型 参数。 __

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)

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



 类似资料:
  • 我的脚本将,作为参数: 但当我将它作为分隔符传递时,它是空的 我知道在参数/参数解析中很特殊,但我以和引用的形式使用它。 为什么它不起作用?我使用的是Python 3.7.3 这是测试代码: 当我运行它作为它打印空。

  • 我正在使用python和argparse编写脚本: 我希望能够运行它与python3parseab.py-a 11-b 22-a 33,和函数A将执行两次与11和33,和函数B一次与22。 现在每个功能只发生一次。 *我不想在每个选项后接受更多参数,而是希望能够接受同一函数的多个实例。 谢谢你!

  • 问题内容: 为了将字典条目转换为变量,是否存在一种将字典的值分配给其键的pythonic方法?我尝试了这个: 更新:也许我应该更具体一些:实际上,我可以肯定键值对是正确的,因为以前我曾将它们定义为变量。然后,我将这些变量存储在字典中(作为键值对),并希望在其他函数中重用它们。我可以在新函数中重新定义它们,但是由于我的字典可能包含约20个条目,因此我认为可能会有更有效的方法。 问题答案: 这就是我想

  • 问题内容: Python不允许将字典用作其他字典中的键。有使用非嵌套字典作为键的解决方法吗? 问题答案: 如果您有一本真正不变的字典(尽管我不清楚为什么不只使用成对列表:eg ),那么您可以将其转换为: 成对的元组。您已经在问题中做到了。需要A而不是因为结果依赖于元素的顺序和不变性。 冻结集。从数学的角度来看,这是一种更合适的方法,因为它只需要不可变元素上的 等式关系,而第一种方法除等式外还需要排

  • 问题内容: 我想在Django模板的字典中使用变量作为键。我一辈子都无法弄清楚该怎么做。如果我有一个带有名称或ID字段的产品,以及带有该产品ID索引的评级词典,那么我想说: 在python中,这可以通过简单的方式完成 但是我无法使其在模板中工作。我尝试使用…没有骰子。有想法吗? 问题答案: 你需要预先准备数据,在这种情况下,你应该将两元组列表传递给模板:

  • 问题内容: 我有一个分配了字符串的变量,我想根据该字符串定义一个新变量。 问题答案: 你可以使用exec: