首页 > 解决方案 > Python中的递归对象属性创建

问题描述

我希望将 Python 代码用于配置文件。这些配置文件是 exec(ed)。所以基本上这个想法是像这样定义配置:

section_1 = {
    "username": "peter",
    "password": "paul"
}

旁注:这不是关于 Python 代码作为配置文件的优缺点的讨论。我喜欢现有的讨论,尤其是 Matteo 的评论。因此,这与将 Python 作为配置文件无关。

如果您愿意,我想“滥用”Python 进行配置。我喜欢并且需要分层数据结构。

我希望为管理配置的开发人员/操作员提供的是能够选择在键/值分配中使用点符号。

所以我的问题是:是否有可能(如果是,那么如何)实现以下功能?

x.y.z = 1
f.g.h.i.j = {"a": b}

变量xf未定义。我很乐意在配置中提供一个全局对象(比如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。

我希望你明白我的意思。提前致谢。

标签: pythonpython-3.x

解决方案


好的,好的,这很难看,但让我知道它是否适合你!让我有点思考!更新,修复了索引问题。

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 方法隐性地创建和实例化自身。每个xinx.x.x.x.y都将是 typedot并且 y 将是唯一具有值的东西。


推荐阅读