辞書型にこだわる

"."を含むパスで辞書型のデータから値の取得を試みた。 今度はパスで値を設定したい。
試してみると、パスに辞書型とリスト型のキーが混在すると複雑になって美しくない。
主に辞書型に対応し、配列があれば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
タグ