在Dict类型变量中使用字符串变量

时间:2019-02-05 06:28:29

标签: python

我们有3种不同的数据中心环境,供参考,例如US,CA和IN。这三个都有一个与其他2个不同的puppetdb master。因此,在自动化某些东西的同时,我想要一个config.json文件,如下所示,并根据传递的参数从主代码中引用它:

// config.json
{
"DEFAULT": {
    "LOGFILE": "log/get_hname.log",
    "LOCKDIR": "include/LOCK",
    "NOOPRUN": "0"
},
"US": {
    "PDB": "puppetdb100.us",
    "VRFFILE": "include/vrf.txt",
    "FQDN": "us.livevox"
},
"CA": {
    "PDB": "puppet.ca.livevox.net",
    "FQDN": "ca.livevox"
},
"IN": {
    "PDB": "puppet100.in.livevox.net",
    "FQDN": "in.livevox"
}
}

现在,对于主脚本,我正在尝试使用一个名为“ myenv”的变量,该变量将是US或CA或IN之一,以引用dict类型的配置中的键。但是我一直收到如下错误:

Traceback (most recent call last):
  File "./get_hname.py", line 94, in <module>
    print (config[myenv.upper()]['PDB'])
KeyError: 'NONE'

以下脚本本身供您参考:

#!/usr/bin/env python

import argparse
import json
import sys 
import os
import logging
import time
from argparse import ArgumentParser

# Where Config File lives --------
CONFFILE = "include/get-hname-cfg.json"
# - DO NOT EDIT BELOW THIS LINE --

with open(CONFFILE, 'r') as f:
config = json.load(f)

logfile = config['DEFAULT']['LOGFILE']
myarguments = argparse.ArgumentParser(description="Arguments for Name Builder", usage="%(prog)s [options]")
myarguments.add_argument("-e", "--env", type=str, metavar="environment", nargs='*', help="Environment")
myarguments.add_argument("-t", "--type", type=str, metavar="servertype", nargs='*', help="Server type")
myarguments.add_argument("-n", "--noop", action="store_true", help="Stimulate the whole run, but don't execute. Similar to noop")
myarguments.parse_args()
args = myarguments.parse_args()

if not args.env and not args.type:
    myarguments.print_help(sys.stderr)

myenv = str(args.env).lower()


pdbhost = "config" +myenv.upper()+ "['PDB']"
print ("%s" %(pdbhost))

if config[myenv.upper()]['PDB'] in globals():
puppetdbhost = config[myenv.upper()]['PDB']

如何将字典中的字符串类型变量用作键?

编辑:请注意,自从我使用PyCharm以来,我的问题中可能缺少的所有必需缩进都已得到处理。

3 个答案:

答案 0 :(得分:0)

您需要修改add_arguments删除nargs='*',这会在列表中显示env  表格请参见以下示例:

myarguments.add_argument("-e", "--env", type=str, metavar="environment", help="Environment")

请参阅this文档以了解更多信息。

答案 1 :(得分:0)

Traceback (most recent call last):
  File "./get_hname.py", line 94, in <module>
    print (config[myenv.upper()]['PDB'])
KeyError: 'NONE'

这意味着myenv变量在那一刻是字符串'None'。检查一下。

答案 2 :(得分:0)

好的,我发现我做错了。我正在使用的参数

type=str and nargs='*'

这就是为什么我遇到类型不匹配并将输出显示为['US']而不是US(或CA或IN)的原因。一旦删除该文件,一切正常。

谢谢大家的指导。有帮助。