继承Networkx MultiDiGraph后调用add_weighted_edges_from报KeyError: None
问题根因
你重写的add_edge方法没有按照父类MultiDiGraph.add_edge的约定返回边的键值,导致后续逻辑无法正确获取刚创建的边的索引,最终触发KeyError: None。
- 父类
MultiDiGraph.add_edge执行完成后会返回新增边的唯一整数key,这个返回值会被上层的add_edges_from方法接收,用来更新边的属性 - 你重写的
add_edge只有调用逻辑没有return语句,默认返回None,当add_edges_from尝试用None作为键去访问边属性时就触发了报错
修复方案
给所有重写的边添加方法补全返回值即可,保持和父类方法的行为一致:
class ClassName(nx.MultiDiGraph): # some code.. def add_edge(self, *args, **kwargs): """ add one edge """ self._dirty = True # 透传父类方法的返回值 return super().add_edge(*args, **kwargs) def add_edges_from(self, *args, **kwargs): """ add several edges """ self._dirty = True # 透传父类方法的返回值 return super().add_edges_from(*args, **kwargs) def add_weighted_edges_from(self, *args, **kwargs): """ add several weighted edges """ self._dirty = True # 透传父类方法的返回值 return super().add_weighted_edges_from(*args, **kwargs)
除了add_edge必须返回key之外,另外两个方法父类本身也有对应返回值(add_edges_from返回新增边的key列表),补全返回值可以避免后续依赖这些返回值的逻辑出现其他隐性问题。
内容的提问来源于stack exchange,提问作者krgira
相关产品推荐
相关产品推荐

