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指出
简单比复杂好。
单行lambda使代码复杂,其中有一个simpler implementation。因此,生产代码中不应使用单线lambda 。不过,我在这里留下这个问题是为了学术上的兴趣。
传递给'defaultdict'的方法必须创建一个新实例,而不是引用回现有对象。在你的情况下,'tree'是一个返回一个新的'defaultdict(tree)'的方法,但是你的一行是一个lambda,它返回'defaultdict(lambda:等)的原始'self._tree'实例' – PaulMcG
@ PaulMcGuire:那么为什么'd = collections.defaultdict(lambda:d); d ['foo'] ['bar']'尽管在打印时很丑陋,似乎可以正常工作? – Sardathrion
Kevin的回答和Tadhg McDonald-Jensen的评论说明了单线lambda方法中的不当递归。 – PaulMcG