首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lambda函数出现Dendropy leaf_iter()错误

lambda函数出现Dendropy leaf_iter()错误
EN

Stack Overflow用户
提问于 2013-06-20 07:43:08
回答 1查看 106关注 0票数 0

我正在Dendropy中做一些系统发生学:我正在尝试,按照本教程,使用一个过滤器(一个lambda函数)遍历一棵树的所有叶子。

如果迭代器为leaf_iter,则使用lambda函数会产生错误,但如果迭代器是任何其他迭代器(例如postorder_node_iterate),则不会产生错误。我遗漏了什么?

回溯代码有几百行,所以我只给你看一段摘录:

代码语言:javascript
复制
Traceback (most recent call last):
  File "<pyshell#274>", line 1, in <module>
    for node in tree_test.leaf_iter(survival):
  File "build\bdist.win32\egg\dendropy\dataobject\tree.py", line 915, in leaf_iter
    for node in self.seed_node.leaf_iter(filter_fn=filter_fn):
  File "build\bdist.win32\egg\dendropy\dataobject\tree.py", line 2444, in leaf_iter
    for node in self.postorder_iter(filter_fn):
  File "build\bdist.win32\egg\dendropy\dataobject\tree.py", line 2427, in postorder_iter
    if filter_fn is None or filter_fn(node):
  File "build\bdist.win32\egg\dendropy\dataobject\tree.py", line 2441, in <lambda>
    filter_fn = lambda x: x.is_leaf() and filter_fn(x) or None

[... line 2441 ...]

  File "build\bdist.win32\egg\dendropy\dataobject\tree.py", line 2441, in <lambda>
    filter_fn = lambda x: x.is_leaf() and filter_fn(x) or None
  File "build\bdist.win32\egg\dendropy\dataobject\tree.py", line 2537, in is_leaf
    return bool(not self._child_nodes)
RuntimeError: maximum recursion depth exceeded while calling a Python object

要测试这个问题,您可以使用以下代码,这些代码几乎取自本教程:

代码语言:javascript
复制
#call a bit of modules and build a simulated tree
import dendropy
import random
from dendropy import TaxonSet, Tree, TreeList, treesim
taxa = dendropy.TaxonSet(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
tree_test = treesim.birth_death(0.4, 0.1, ntax=8, taxon_set=taxa, repeat_until_success=True)

#define an evolutionary character
def evolve_char(tree, start=1.0):
    for node in tree.preorder_node_iter():
        if node.parent_node is None:
            node.value = 1.0
        else:
            node.value = random.gauss(node.parent_node.value, node.edge.length)
    return tree
#evolve the character on the simulated tree
evolve_char(tree_test)

#positive_char select the nodes with positive character
positive_char = lambda node: True if node.value > 0. else False

#iter with postorder_node_iter (no problem)
for node in tree_test.postorder_node_iter():
    print("Node %s with value %s" % (node.taxon, node.value))
for node in tree_test.leaf_iter(positive_char):
    print("Node %s with value %s" % (node.taxon, node.value))

#iter with leaf_iter without filtering (no problem)
for node in tree_test.leaf_iter():
    print("Node %s with value %s" % (node.taxon, node.value))

#iter with leaf_iter and filtering (problem!)
for node in tree_test.leaf_iter(positive_char):
    print("Node %s with value %s" % (node.taxon, node.value))
EN

回答 1

Stack Overflow用户

发布于 2013-06-20 08:05:03

好吧,那是个bug。刚在新的github版本中修复。

我把这个留在这里,因为其他人可能会发现同样的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17203129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档