更改Python软件包的功能而无需修改库代码

问题描述

根据this answer.,对networkx包进行了微小的更改,使其表现出我想要的样子

即我只需要将此代码添加到打包代码中的文件之一即可。

# ADD THIS LINE - prevent things from flying off into infinity if not connected
displacement = displacement - pos / ( k * np.sqrt(nnodes))

有没有一种方法可以以编程方式执行此操作而不实际修改代码?这是“猴子修补”的情况吗?如果可能的话,我该怎么办?

解决方法

查看链接的答案和spring_layout函数的代码,您要执行的操作就是更改函数_fruchterman_reingold。由于无法在运行时在函数内添加代码行,因此需要定义自己的函数以实现所需的更改,然后将内部networkx _fruchterman_reingold绑定到函数,这确实是一种猴子修补。该代码可能如下所示:

# Assume you already defined the modified function and name it my_reingold 

import networkx as nx
nx.drawing.layout._fruchterman_reingold = my_reingold

也就是说,无需在运行时修补Networkx源代码或猴子修补程序,您只需从layout.py文件(即fruchterman_reingold_layout,_fruchterman_reingold,_sparse_fruchterman_reingold)复制所需的代码并创建您的小功能/模块,这本来就更安全,但也许乐趣可能会减少。