将字典的键变为成员变量的需求
公司领导写java写多了,review python代码的时候发现:“为啥你的json格式(dict)咋全部用键名来索引,这个要按照java的写法,用点来取值,这样用户使用的时候直接点点点就行,不需要自己还要去查有哪些键,你改下代码,用点来取值,兼容一下现在的格式,以后discard调python的索引方式......”
既然是领导的要求,小的莫敢不从。于是就有了题名的需求。
搜了下,python是动态语言,可以动态设置成员变量,但是只给个类,然后用的时候加进去,太丑陋了。调研了一会发现有几种写法:
方法一:
class mydict(dict):
__getattr__= dict.__getitem__
__setattr__= dict.__setitem__
__delattr__= dict.__delitem__
这是最简单的,看下结果:
发现这种写法虽然简单,但是只能索引一层字典的键,对于嵌套的字典,是无法来继续用点点点的方式取值,并且这种写法不支持IDE自动提示。
方法二:
参考Bunch包后得到的极简版:
class AttrDict(dict):
def __init__(self, *args, **kwargs):
super(AttrDict, self).__init__(*args, **kwargs)
self.__dict__ = self
@staticmethod
def fromDict(d):
return AttrDict.recursion(d)@staticmethod
def recursion(x):
if isinstance(x, dict):
return AttrDict((k, bunchify(v)) for k, v in x.items())
else:
return x
结果:
可以,使用递归,很好的可以一直点点点来弹出提示取值了。