【发布时间】:2016-06-24 05:19:45
【问题描述】:
我正在尝试制作一个字典(从 yaml 数据中读取),其行为就像一个类。因此,如果我调用class.key 我会检索他的值。代码如下:
import errno
import sys
import yaml
backup_conf="""
loglevel: INFO
username: root
password: globalsecret
destdir: /dsk/bckdir/
avoidprojects:
matchregex: /bkp/
depots:
server1:
password: asecret
server2:
username: root
server3:
server4:
destdir: /disk2/bkp/
projects:
proj1:
matchregex:
- /backups/
- /bkp/
"""
class Struct:
def __init__(self, **entries):
self.__dict__.update(entries)
class Config:
def __init__(self, filename="backup.cfg", data=None):
self.cfg = {}
if data is None:
try:
fd = open(filename,'r')
try:
yamlcfg = yaml.safe_load(fd)
except yaml.YAMLError as e:
sys.exit(e.errno)
finally:
fd.close()
except ( IOError, OSError ) as e:
sys.exit(e.errno)
else:
try:
yamlcfg = yaml.safe_load(data)
except yaml.YAMLError as e:
sys.exit(e.errno)
self.cfg = Struct(**yamlcfg)
def __getattribute__(self, name):
try:
return object.__getattribute__(self, name)
except AttributeError:
return self.cfg.__getattribute__(name)
def get_depot_param(self,depot,param):
try:
self.depot_param = self.cfg.depots[depot][param]
except ( TypeError, KeyError) as e:
try:
self.depot_param = getattr(self.cfg, param)
except KeyError as e:
sys.exit(e.errno)
return self.depot_param
def get_project_param(self,project,param):
try:
self.project_param = self.cfg.projects[project][param]
except ( TypeError, KeyError) as e:
try:
self.project_param = getattr(self.cfg, param)
except KeyError as e:
sys.exit(e.errno)
return self.project_param
def get_project_matches(self,project):
try:
self.reglist = self.cfg.projects[project]['matchregex']
except KeyError as e:
try:
self.reglist = self.cfg.matchregex
except KeyError as e:
print "Error in configuration file: {0}: No default regex defined. Please add a matchregex entry on conf file".format(e)
sys.exit(e.errno)
if isinstance(self.reglist, str):
self.reglist = self.reglist.split()
return self.reglist
def get_depots(self):
return self.cfg.depots.keys()
if __name__ == '__main__':
# Read config file to cfg
config = Config(data=backup_conf)
代码运行良好,我能够获取如下数据:config.cfg.loglevel 按预期返回INFO。但我想知道如何调用 config.loglevel 删除那个 cleary 来自我的 self.cfg 实例变量的 cfg。 (当然欢迎任何增强代码的技巧)。
【问题讨论】:
-
您似乎已经尝试使用
__getattribute__。当您尝试使用config.loglevel时会发生什么?你有例外吗? -
是的。我试过了,但没有奏效。我得到:
AttributeError: Config instance has no attribute 'loglevel',实际上我在__getattribute__中添加了except,但仍然没有用。我正在运行python 2.6.6(环境需要它) -
字典已经确实表现得像一个类。它有一个
get(keyname)method,它接受一个字符串。您的意思是,您希望 dict 的行为类似于 object,即 允许按名称访问其属性(/properties)而无需引用。这个问题在此之前已经回答了很多次,请参阅重复项。
标签: python class dictionary yaml