从python字典到设置列表

and*_*tti 0 python dictionary

我希望能够在可以设置的选项列表中转换字典(使用完整路径),例如,这应该通过:

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,你怎么看?

Sve*_*ach 6

如果字典应该是任意嵌套的,那么递归方法最可能是最简单的.

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)