我有嵌套字典,加密功能和虚线路径,我想应用我的加密功能来加密特定字段。 例如:
mydict
{"a":{
...
"b":{
...
"c":"value"
}
}
}
字段路径:' a.b.c'
我想对c值执行加密功能并修改我的字典。 什么是最有效和pythonic的方式?
答案 0 :(得分:1)
字典在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])
答案 1 :(得分:1)
我猜你的意思是嵌套的数量可以根据像$vm.LicenseType = "Windows_Server"
这样的字符串变化:
'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
答案 2 :(得分:1)
使用以下功能
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}}}
答案 3 :(得分:1)
也许为时已晚,棘手,但要起作用:
SELECT userid, max(timestamp) timestamp
FROM users
WHERE userid IN (22,15,42)
GROUP BY userid
答案 4 :(得分:0)
通过推荐的做法,您应该可以通过
获得{"a":{"b":{"c":"whatever the encrypted value is"}}}
或者你可以添加一个类来对象使用点(虽然是一个hacky解决方案)。
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)