Networkx节点删除/移除回调

Networkx node deletion / removal callback

给定一个有向 networkx 图。我想要一个函数,比如“abc()”,为从图中删除的每个节点调用。我浏览了 networkx 文档,但没有找到任何此类回调功能。

我考虑的是:

  1. 将对 abc() 的调用添加到与节点关联的对象的 __del__()(解构函数)方法。然而,除了使用 __del__() 的陷阱(参见 here)之外,如果内存中某处存在指向节点对象的任何链接,这将不起作用。
  2. Subclassing networkx.DiGraph() class 并覆盖 remove_node() 方法。缺点:这将需要重写所有删除节点的方法,例如remove_nodes_from(还有吗?)
  3. 由于 networkx 图的实现是基于字典的,因此它可以以某种方式解决 'hook' 该字典的 del 功能。不过,对 networkx 进行如此深入的干预似乎是不合适的。

实现每次删除 networkx 节点时调用的回调函数的最简单方法是什么?

在这种情况下你只需要subclass两个方法。这是一个例子 从 networkx 导入有向图

class RemoveNodeDiGraph(DiGraph):
    def remove_node(self, n):
        DiGraph.remove_node(self, n)
        print("Remove node: %s"%n)

    def remove_nodes_from(self, nodes):
        for n in nodes:
            self.remove_node(n)

if __name__=='__main__':
    G = RemoveNodeDiGraph()
    G.add_node('foo')
    G.add_nodes_from('bar',weight=8)
    G.remove_node('b')
    G.remove_nodes_from('ar')

这不会像 DiGraph class(尤其是 remove_nodes_from())中的原始方法那么快,但除非您有非常大的图,否则它可能不会很重要。如果您需要更好的性能,您可以直接从这些方法中复制代码,而不是调用 superclass.