可以使用单点分隔字符串路径设置Python嵌套字典项吗?

Gat*_*ndo 4 python dictionary path

我希望能够使用单个点分隔的字符串路径设置嵌套字典项。例如,给定以下字典:

data_dictionary = {
  "user_data": {
    "first_name": "Some",
    "last_name": "Guy",
    "phone": "212-111-1234"
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够使用单个字符串设置特定项目,如下所示:

data_dictionary['user_data.phone'] = '818-333-4567'
Run Code Online (Sandbox Code Playgroud)

有人知道完成类似事情的库或简单技术吗?

sch*_*ggl 6

您可以定义一个小辅助函数:

def set(obj, path, value):
    *path, last = path.split(".")
    for bit in path:
        obj = obj.setdefault(bit, {})
    obj[last] = value

set(data_dictionary, "user_data.phone", "123")
data_dictionary
# {'user_data': {'first_name': 'Some', 'last_name': 'Guy', 'phone': '123'}}
Run Code Online (Sandbox Code Playgroud)

您还可以子类化dict和覆盖__setitem__

class my_dict(dict):
  def __setitem__(self, item, value):
    if "." in item:
      head, path = item.split(".", 1)
      obj = self.setdefault(head, my_dict())
      obj[path] = value
    else:
      super().__setitem__(item, value)

dd = my_dict({
    "user_data": {
        "first_name": "Some",
        "last_name": "Guy",
        "phone": "212-111-1234"
    }
})

dd["user_data.phone"]  = "123"
dd
# {'user_data': {'first_name': 'Some', 'last_name': 'Guy', 'phone': '123'}}
Run Code Online (Sandbox Code Playgroud)