我希望能够在可以设置的选项列表中转换字典(使用完整路径),例如,这应该通过:
def test_dic_to_args(self):
dic = {"x1": {"x2": "val1"}, "x2": "val3"}
des = ["x1.x2:val1", "x2:val3"]
self.assertEqual(conf.dict_to_args(dic), des)
Run Code Online (Sandbox Code Playgroud)
现在我开始编写它,我认为它很简单,但它比我想象的更棘手,有队列,类型检查等等.有没有一种聪明的方法来解决这个问题?也许最好的选择仍然是递归DFS,你怎么看?
如果字典应该是任意嵌套的,那么递归方法最可能是最简单的.
def dict_to_args(d, prefix=()):
for k, v in d.iteritems():
if isinstance(v, dict):
for x in dict_to_args(v, prefix + (k,)):
yield x
else:
yield ".".join(prefix + (k,)) + ":" + v
Run Code Online (Sandbox Code Playgroud)
例:
>>> list(dict_to_args(dic))
['x2:val3', 'x1.x2:val1']
Run Code Online (Sandbox Code Playgroud)