Python字典类型数据通如何过点‘.’的方式访问
作者:redrose2100   类别:    日期:2022-05-10 03:26:15    阅读:1316 次   消耗积分:0 分

(1)对于类似如下结构类型的数据,在一定的场合下,希望类似于info.student, info.student.name, info.teacher.course.math 等递归地通过点(.)的方式调用字典的数据

  1. info={
  2. "student":{
  3. "name":"zhangsan",
  4. "age":20,
  5. "male":"man"
  6. },
  7. "teacher":{
  8. "name":"Mr Wang",
  9. "age":25,
  10. "male":"woman",
  11. "course":{
  12. "math":"Friday",
  13. "english":"Monday"
  14. }
  15. }
  16. }

(2)可通过自定义如下类,然后将上述字典类型的数据转换一下即可
本质是递归的将字典类型的数据转换为Dotdict类型的(即实现了getattr的类)

  1. class DotDict(dict):
  2. def __init__(self, *args, **kwargs):
  3. super(DotDict, self).__init__(*args, **kwargs)
  4. def __getattr__(self, key):
  5. value = self[key]
  6. if isinstance(value, dict):
  7. value = DotDict(value)
  8. return value

(3)完整代码如下:

  1. class DotDict(dict):
  2. def __init__(self, *args, **kwargs):
  3. super(DotDict, self).__init__(*args, **kwargs)
  4. def __getattr__(self, key):
  5. value = self[key]
  6. if isinstance(value, dict):
  7. value = DotDict(value)
  8. return value
  9. info={
  10. "student":{
  11. "name":"zhangsan",
  12. "age":20,
  13. "male":"man"
  14. },
  15. "teacher":{
  16. "name":"Mr Wang",
  17. "age":25,
  18. "male":"woman",
  19. "course":{
  20. "math":"Friday",
  21. "english":"Monday"
  22. }
  23. }
  24. }
  25. dot_info=DotDict(info)
  26. print(dot_info.student)
  27. print(dot_info.student.name)
  28. print(dot_info.teacher.name)
  29. print(dot_info.teacher.course.math)

执行结果如下:

  1. {'name': 'zhangsan', 'age': 20, 'male': 'man'}
  2. zhangsan
  3. Mr Wang
  4. Friday
始终坚持开源开放共享精神,同时感谢您的充电鼓励和支持!
版权所有,转载本站文章请注明出处:redrose2100, http://blog.redrose2100.com/article/135
个人成就
  • 博客总数: 613 
  • 阅读总量: 709106 
  • 2022年 : 371 篇 
  • 2023年 : 211 篇 
  • 2024年 : 31 篇 
  • 2025年 : 0 篇 
测试开发技术全栈公众号
DevOps技术交流微信群