辞書型にこだわる
"."を含むパスで辞書型のデータから値の取得を試みた。
今度はパスで値を設定したい。
試してみると、パスに辞書型とリスト型のキーが混在すると複雑になって美しくない。
主に辞書型に対応し、配列があればrootに一番近い配列を追加する。
class Dictionary():
data = {}
def get(self):
return self.data
def add(self, s):
try: self.data.update(eval(s))
except: pass
def set(self, path, value):
def dot2bra(path):
if '"' in path: return path
path = '["' + ( path.replace('].',']["').replace('.','"]["').replace('[','"][') + '"]' ).replace(']"]',']')
return path.replace('[""]','')
def parse(path):
path = path[1:-1].split('][')
for i,key in enumerate(path): path[i] = key.strip('"') if key[0]=='"' and key[-1]=='"' else int(key)
return path
path = dot2bra(path)
keys = parse(path)
d = value
for key in keys[::-1]:
if type(key) is int: d = [d]
elif type(key) is str: d = {key:d}
data = self.data
for key in keys[:-1]:
if type(key) is int:
data.extend(d)
break
else:
if key in data:
data = data[key]
d = d[key]
else:
data[key] = d[key]
break
else:
if type(data) is dict: data.update(d)
else: data.append(d)
return self.data
2020/07/24 22:25