我希望对配置文件使用Python代码。这些配置文件是exec(ed)。因此,基本上的想法是这样定义配置:
section_1 = {
"username": "peter",
"password": "paul"
}
侧面说明:这不是关于Python代码作为配置文件的优缺点的讨论。我喜欢existing discussion,尤其喜欢Matteo的评论。因此,这与将Python作为配置文件无关。
如果愿意,我想“滥用” Python进行配置。我喜欢并需要分层数据结构。
我希望为管理配置的开发人员/操作人员提供的功能是能够选择在键/值分配中使用点表示法。
所以我的问题是:是否可以(如果是,则如何)实现以下功能?
x.y.z = 1
f.g.h.i.j = {"a": b}
变量 x 和 f 未定义。我很高兴在这样的配置中提供一个全局对象(例如 g ):
from app.config.directive import g
g.x.y.z = 1
g.f.g.h.i.j = {"a": b}
是否可以使用Python来实现?目的是通过如下方式访问已定义的数据结构:
g["x"]["y"]["z"] == 1
isinstance(g["f"]["g"]["h"]["i"]["j"], dict) == True
从Python的角度来看,我确实知道这是一个坏主意。这当然不是pythonic。请记住:我希望使用Python进行配置管理,并基本上通过一些特殊指令“扩展” Python。
我希望你明白我的意思。预先感谢。
答案 0 :(得分:2)
好的,好的,这很丑陋,但请告诉我它是否对您有用!让我有点思考!已更新,已解决索引编制问题。
class dot(object):
"""dot.notation god class"""
def __init__(self):
self.next=None
def __getitem__(self, key):
return self.__dict__[key]
def __setattr__(self, name, value):
self.__dict__[name] = value
def __getattr__(self, attr):
if attr not in self.__dict__:
self.__dict__[attr] = dot()
return self.__dict__[attr]
>>> x=dot()
>>> x.g.h.j=3
>>> x['g']
<__main__.dot object at 0x1023f6cd0>
>>> x['g']['h']['j']
3
所以...它将通过set dunder方法隐性地创建自己及其实例。 x
中的每个x.x.x.x.y
的类型为dot
,而y是唯一具有值的东西。