Sar*_*ica 7 python dictionary autovivification data-structures
根据这个答案,我想创建一个单行树作为另一个类的一部分,如下所示:
self._tree = collections.defaultdict(lambda: self._tree)
Run Code Online (Sandbox Code Playgroud)
我需要允许所述类的用户将路径元素添加到树中,并从最低的树级开始运行一些回调.我运行时,我的天真实现会引发错误pytest:
def _add(self, tree, path):
for node in path:
tree = tree[node]
def _run(self, tree, callback):
for key in tree.keys():
callback(tree[key]) # !!! Recursion detected (same locals & position)
self._run(key)
Run Code Online (Sandbox Code Playgroud)
如果树定义为,则此代码有效
def tree():
return collections.defaultdict(tree)
self._tree = tree()
Run Code Online (Sandbox Code Playgroud)
为什么我的天真方法不适用于lambda表达式?
⚠Python的禅宗说明了这一点
简单比复杂更好.
单行lambda使代码复杂,实现更简单.因此,不应在生产代码中使用单行lambda .但是,我会在这里提出这个问题以获得学术兴趣.
第一个链接问题中的单行默认设计对我来说不合适.它产生不寻常的自引用循环:
>>> d = collections.defaultdict(lambda: d)
>>> d["a"] = 23
>>> d["b"]["c"] = 42
>>> print d["b"]["a"] #we never created a value with these keys, so it should just return a defaultdict instance.
23
>>> #uh, that's not right...
Run Code Online (Sandbox Code Playgroud)
第二个链接中函数的单行lambda实现看起来更像:
tree = lambda: defaultdict(tree); self._tree = tree()
编辑:看起来你可以在一个语句中执行以下操作:
self._tree = (lambda f: f(f))(lambda t: defaultdict(lambda: t(t)))
Run Code Online (Sandbox Code Playgroud)
......但是要求大学级别的lambda演算技巧只是为了缩小你的剧本一个陈述似乎是一个不明智的讨价还价.考虑一种更容易理解的方法.