从虚线路径操作嵌套字典的 pythonic 方法



我有一个嵌套字典,一个加密函数和一个虚线路径,我想应用我的加密函数来加密特定字段。例:

米迪克特

{"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

最新更新