Networkx节点删除/删除回调



给定一个有向networkx图。我想为从图中删除的每个节点调用一个函数,比如"abc()"。我浏览了networkx文档,但没有发现任何这样的回调功能。

我认为:

  1. 向与节点关联的对象的__del__()(解构器)方法添加对abc()的调用。然而,除了使用__del__()的陷阱之外(例如,请参见此处),如果内存中存在指向节点对象的任何链接,那么这也不起作用
  2. 子类networkx.DiGraph()并重写remove_node()方法。缺点:这需要覆盖所有删除节点的方法,例如remove_nodes_from(还有其他方法吗?)
  3. 由于networkx图的实现是基于字典的,因此可以通过某种方式"挂接"该字典的del函数。不过,将这种深度干扰到networkx似乎是不合适的

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

在这种情况下,您只需要对两个方法进行子类化。下面是一个例子从networkx导入DiGraph

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类中的原始方法那样快(尤其是remove_nodes_from()),但除非你有非常大的图,否则它可能不会很重要。如果您需要更好的性能,可以直接从这些方法复制代码,而不是调用超类。

最新更新