【问题标题】:error is raised when I try to remove elements (pydot objects) from a python list当我尝试从 python 列表中删除元素(pydot 对象)时引发错误
【发布时间】:2011-10-06 06:58:06
【问题描述】:

我正在编写一个算法来表示回归树,使用 pydot 模块(Graphviz 的 Dot 语言的接口)。 在算法中,边​​和节点的列表被创建,然后它们被表示——这工作正常。

但在某些特定情况下,我需要删除一些边缘和节点,这就是我卡住的地方。以下是部分代码:

import pydot
graph = pydot.Dot(graph_type='graph')

link4 = pydot.Edge(node10, node21, label=etiquetas[3])
link5 = pydot.Edge(node11, node22, label=etiquetas[4])
lista_links = [link4, link5]

# if some conditions are verified, then:
lista_links.remove(link5)

for link in lista_links:
graph.add_edge(link)
graph.write_png('teste.png')

我原以为这段代码可以正常工作,但我得到一个错误,说:

AttributeError: 'NoneType' object has no attribute 'get_top_graph_type'

我唯一的想法是,在我定义所有特定情况后,更改代码并仅添加节点和边缘,而不是在某些特定情况下删除节点和边缘。但这将是更多的工作......(代码比我向您展示的要大得多,并且我有几个需要考虑的具体情况)。

我很好奇为什么 python 会这样... 有人可以向我解释一下,或者告诉我如何改变这种行为吗?

提前致谢, 卡拉

【问题讨论】:

    标签: python list pydot


    【解决方案1】:

    从表面上看,问题似乎出在没有父图的边或节点上。所以,整体的解决方案是:不允许节点和边在周围徘徊,始终将它们附加到图形,然后根据需要从图形中删除。

    【讨论】:

    • 如果 self.get_parent_graph().get_top_graph_type() == 'graph',则异常发生在 __eq__(self, edge) 文件 pydot.pyc 的第 821 行:
    • 从这里不清楚,你的代码确实调用了什么,这会导致异常。如果可以,请提供完整的堆栈。似乎在 pydot 内部, None 值代替了库期望的对象(Edge,或具有 get_top_graph_type() 方法的东西)。
    • 从表面上看,问题似乎出在没有父图的边或节点上。因此,整体解决方案是:不允许节点和边徘徊,始终将它们附加到图形,然后根据需要从图形中删除。
    • 这可能是一个更好的解决方案!但是如何从图中删除边或节点?
    • 从 pydot 文档看来,graph 有 .del_node 方法,它按名称删除所有节点。因此,您的任务是保留稍后要删除的节点和边的名称列表(即纯字符串),然后删除它们。请注意,在按名称删除元素时,您将删除所有具有该名称的元素——因此请注意名称的唯一性。
    猜你喜欢
    • 2019-05-12
    • 2020-08-08
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    相关资源
    最近更新 更多