Based of this answer , 我想创建一个 one line tree作为另一个类的一部分,如下所示:
self._tree = collections.defaultdict(lambda: self._tree)
我需要允许所述类的用户将路径元素添加到树中,并从最低的树级别开始运行一些回调。当我运行 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)
如果树定义为
,则此代码有效 def tree():
return collections.defaultdict(tree)
self._tree = tree()
为什么我的天真方法不适用于 lambda 表达式?
⚠ Zen of Python指出
Simple is better than complex.
单行 lambda 使代码变得复杂,其中有一个 simpler implementation。 .因此,单行 lambda 不应在生产代码中使用。但是,出于学术兴趣,我将把这个问题留在这里。
最佳答案
第一个链接问题中的单行 defaultdict 设计对我来说不合适。它会产生不寻常的自引用循环:
>>> 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...
第二个链接中函数的单行 lambda 实现看起来更像:
tree = lambda: defaultdict(tree); self._tree = tree()
编辑:看起来你可以在一条语句中完成:
self._tree = (lambda f: f(f))(lambda t: defaultdict(lambda: t(t)))
...但是要求大学水平的 lambda 演算技能只是为了将脚本缩小一个语句似乎是不明智的交易。考虑一种更易于理解的方法。
关于python - 一线树实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35752219/