python - 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}
变量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。
我希望你明白我的意思。提前致谢。
解决方案
好的,好的,这很难看,但让我知道它是否适合你!让我有点思考!更新,修复了索引问题。
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
inx.x.x.x.y
都将是 typedot
并且 y 将是唯一具有值的东西。
推荐阅读
- azure - 代表流程的 azure 广告范围始终返回所有同意的范围
- mysql - 如何从另一个托管服务提供商向 MySQL 数据库添加新用户?
- reactjs - 来自服务器的 Redux 初始状态
- linux - 如果列匹配,则在匹配前打印一行
- java - 如何修复:java.lang.IllegalStateException:提交响应后无法转发
- dialogflow-es - 有没有办法使用 Dialogflow 从电报机器人获取用户坐标?
- python - 如何更有效地遍历大型 CSV 文件?
- css - 在 Bootstrap 4 中自定义 .input-group-append
- python - 数据库重启时 SqlAlchemy 崩溃
- c - 我不太明白它添加 5 位输入总和的语法