我正在使用this SSM方法从我的AWS参数存储中获取一堆敏感凭证。路径语法使我可以一次拉出一堆相关的凭证,这很酷,但是如您所见,返回格式更多是字典列表。我已经剥离了所有内容,以便可以采用以下格式获取所有参数:
{
'/a/b/c/d/e': 'xxxxxxxx',
'/a/b/c/d/f': 'xxxxxx',
'/a/b/c/g': 'xxxxxx'
}
但是我在将这种格式传递给某种(假设是递归的)函数时遇到麻烦,该函数将带有路径键的字典重新格式化为实际的嵌套字典,如下所示:
{
'a': {
'b': {
'c': {
'd': {
'e': 'xxxxxxx',
'f': 'xxxxxxx'
},
'g': 'xxxxxxx'
}
}
}
}
有人做过这样的事吗?
答案 0 :(得分:3)
尝试一下:
d = {
'/a/b/c/d/e': 'xxxxxxxx',
'/a/b/c/d/f': 'xxxxxx',
'/a/b/c/g': 'xxxxxx'
}
output = {}
for key, value in d.items():
directories = key.split('/')[1:]
helper = output
for dire in directories[:-1]:
if dire not in helper:
helper[dire] = {}
helper = helper[dire]
helper[directories[-1]] = value
print(output)
输出为:
{
'a': {
'b': {
'c': {
'd': {
'e': 'xxxxxxxx',
'f': 'xxxxxx'
},
'g': 'xxxxxx'
}
}
}
}
答案 1 :(得分:1)
这种方法不能很好地满足您的需求,但是如果分隔符是句号而不是正斜杠,那么它将很好用。
从Pypi安装unflatten (https://pypi.org/project/unflatten/)
pip install unflatten
代码:
from unflatten import unflatten
t = {
'a.b.c.d.e': 'xxxxxxxx',
'a.b.c.d.f': 'xxxxxx',
'a.b.c.g': 'xxxxxx'
}
print(unflatten(t))
输入:
{
'a.b.c.d.e': 'xxxxxxxx',
'a.b.c.d.f': 'xxxxxx',
'a.b.c.g': 'xxxxxx'
}
输出:
{'a': {'b': {'c': {'g': 'xxxxxx', 'd': {'f': 'xxxxxx', 'e': 'xxxxxxxx'}}}}}
答案 2 :(得分:1)
您可以继承follwoing之类的字典
class RecursiveDict(dict):
def __missing__(self, key):
self.__setleaf__(key, RecursiveDict())
return self[key]
def __setleaf__(self,key,value):
super(RecursiveDict, self).__setitem__(key,value)
def __setitem__(self, key,value):
keys = key.strip('/').split('/')
tmp = self
for k in keys[:-1]:
tmp = tmp[k]
tmp.__setleaf__(keys[-1],value)
您可以按以下方式使用它
d = RecursiveDict()
d['/a/b/c/d/e'] = 'xxxxxxxx'
d['/a/b/c/d/f'] = 'xxxxxx'
print(d)
答案 3 :(得分:0)
我编写了用于从参数存储中读取值的库(ssmenv)
from ssmenv import SSMEnv
params = SSMEnv("/service/my-service", "/resource/mysql")
这样,您将获取“ / service / my-service”和“ / resource / mysql”命名空间下的所有密钥作为规范化的密钥,例如“ SERVICE_MY_SERVICE_DEBUG”