根据您的需要,最简单的选项可能是使用元组作为字典键而不是嵌套字典:
kidshair['allkids', 'child3', 'hair']
mypath = ('allkids', 'child3', 'hair')
kidshair[mypath]
唯一的问题是你无法获得字典的一部分,因此,例如,你不能(轻松/有效地)访问与’child3’有关的所有内容.根据您的使用情况,这可能是也可能不适合您.
使用当前结构的替代方法是执行以下操作:
>>> from functools import partial
>>> test = {"a": {"b": {"c": 1}}}
>>> def itemsetter(item):
... def f(name, value):
... item[name] = value
... return f
...
>>> mypath = partial(itemsetter(test["a"]["b"]), "c")
>>> mypath(2)
>>> test
{'a': {'b': {'c': 2}}}
这里我们创建一个函数itemsetter(),它(在operator.itemgetter()的脉络中)为我们提供了一个函数,用于设置给定字典中的相关键.然后我们使用functools.partial生成此函数的一个版本,其中包含我们想要预先填充的键.它也不是mypath =蓝色,但它并不坏.
如果您不想打扰与运算符模块一致的内容,您可以简单地执行以下操作:
def dictsetter(item, name):
def f(value):
item[name] = value
return f
mypath = dictsetter(test["a"]["b"], "c")
mypath(2)