我有一个嵌套字典,一个加密函数和一个虚线路径,我想应用我的加密函数来加密特定字段。例:
米迪克特
{"a":{
...
"b":{
...
"c":"value"
}
}
}
字段路径:a.b.c
我想对c
值执行加密功能并修改我的字典。什么是最有效和最pythonic的方式?
使用以下函数
def update(d, path, value):
out = path.split('.', 1)
key = out[0]
if len(out) > 1:
path = out[1]
return update(d[key], path, value)
else:
d[key] = value
d = {'a': {'b': {'c': 'value'}}}
path = 'a.b.c'
value = 100 # let's consider encrypted value
update(d, path, value)
print(d )
# Output: {'a': {'b': {'c': 100}}}
也许有点太晚了,有点棘手,但要起作用:
from functools import reduce
d = {'a': {'b': {'c': 'value'}}}
path = 'a.b.c'
# result will be 'value'
result = reduce(dict.__getitem__, path.split('.'), d)
我猜你的意思是让嵌套的数量根据字符串变量,例如 'a.b.c'
:
d = {"a":{"b":{"c":"value"}}}
dotted = 'a.b.c'
paths, current = dotted.split('.'), d
for p in paths[:-1]:
current = current[p]
current[paths[-1]] = encrypt(current[paths[-1]])
这会将给定的字典d
修改为
{"a":{"b":{"c":"whatever the encrypted value is"}}}
通过推荐的做法,您可能应该通过以下方式获得它,
d['a']['b']['c']
或者你可以添加一个类来客观化使用点(虽然是一个黑客的解决方案(。
class Objectify(object):
def __init__(self, obj):
for key in obj:
if isinstance(obj[key], dict):
self.__dict__.update(key=Objectify(obj[key]))
else:
self.__dict__.update(key=obj[key])
d = Objectify({'a': {'b': {'c': True}}})
print(d.a.b.c)
结果:
True
字典
在python中非常高效,所以你可以直接加密它:
# d -- dictionary
key1 = d.keys()[0]
key2 = d[key1].keys()[0]
key3 = d[key1][key2].keys()[0]
d[key1][key2][key3] = encrypt(d[key1][key2][key3])
<</div>
div class="one_answers"> 您可以使用 glom 赋值就地获取和修改值:
from glom import glom, assign, Assign, Spec
d = {'a': {'b': {'c': 'value'}}}
选项 1 具有常规 glom 分配:
value_to_encrypt = glom(d,'a.b.c') # deep-get
_ = assign(d, 'a.b.c', encrypt(value_to_encrypt)) # deep-modify 'c' in place
选项 2 具有深度应用:
_ = glom(d, Assign('a.b.c', Spec(('a.b.c', encrypt)))) # applies 'encrypt' on a.b.c and modifies the value in place