在Python中创建递归对象属性

时间:2018-08-08 20:19:41

标签: python python-3.x

我希望对配置文件使用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。

我希望你明白我的意思。预先感谢。

1 个答案:

答案 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是唯一具有值的东西。