【问题标题】:test for node membership in pydot graph测试 pydot 图中的节点成员资格
【发布时间】:2011-09-10 06:13:16
【问题描述】:

pydot 有大量的绑定方法来获取和设置点图中的每一个小东西,读取和写入,随便你说,但我似乎找不到简单的成员资格测试。

>>> d = pydot.Dot()
>>> n = pydot.Node('foobar')
>>> d.add_node(n)

>>> n in d.get_nodes()
False

只是许多不起作用的事情之一。似乎节点一旦添加到图形中,就会获得新的身份

>>> d.get_nodes()[0]
<pydot.Node object at 0x171d6b0>
>>> n
<pydot.Node object at 0x1534650>

任何人都可以建议一种方法来创建节点并在添加之前测试它是否在图表中,以便您可以执行以下操作:

d = pydot.Dot()
n = pydot.Node('foobar')
if n not in d:
    d.add_node(n)

【问题讨论】:

    标签: python graphviz dot pydot


    【解决方案1】:

    查看源代码http://code.google.com/p/pydot/source/browse/trunk/pydot.py,似乎节点名称是唯一值,用作在图的节点字典中定位节点的键(但有趣的是,它不会为现有节点返回错误,它只是将新节点的属性添加到现有节点的属性中)。

    因此,除非您想将 __contains__() 的实现添加到执行以下操作的 pydot.py 文件中的类之一,否则您可以在代码中执行以下操作:

    if n.get_name() not in d.obj_dict['nodes'].keys():
        d.add_node(n)
    

    【讨论】:

    • 谢谢@JAB。我会得出同样的结论。不满意,但你的解决方案比我的好:if n.get_name() not in [node.get_name() for node in d.get_node_list()]
    • 您可以随时向pydot 的创建者提出这个问题。毕竟,这是一个开源项目。 ...另外,我刚刚发现了为什么,具体来说,你在改变身份方面遇到了问题,以及为什么他们可能不想改变事情。 code.google.com/p/pydot "Graph、Node、Edge 对象只是数据的代理,是按需创建的。"
    猜你喜欢
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2012-03-15
    • 2021-11-27
    • 2020-05-05
    • 2011-07-11
    • 2020-08-19
    相关资源
    最近更新 更多