17

我有一堆 Python 模块要清理、重组和重构(有一些重复的代码,一些未使用的代码......),我想知道是否有工具可以绘制哪个模块使用哪个其他模块的地图.

理想情况下,我想要这样的地图:

main.py
 -> task_runner.py
  -> task_utils.py
  -> deserialization.py
   -> file_utils.py
 -> server.py
  -> (deserialization.py)
  -> db_access.py

checkup_script.py
re_test.py
main_bkp0.py
unit_tests.py

...这样我就可以知道我可以首先开始移动哪些文件(file_utils.py,db_access.py),我的 main.py 没有使用哪些文件,因此可以删除等等。(我实际上正在工作大约 60 个模块)

编写一个执行此操作的脚本可能不会复杂(尽管 import 有不同的语法要处理),但我也希望我不是第一个想要这样做的人(如果有人做了一个工具,它可能包括其他简洁的功能,例如告诉我哪些类和函数可能没有使用)。

你知道任何帮助代码重组的工具(甚至是简单的脚本)吗?

你知道我正在尝试做的更准确的术语吗?代码重组?

4

4 回答 4

15

Python 就是modulefinder这样做的。编写一个将这些信息转换为导入图(可以使用例如graphviz进行渲染)的脚本非常容易:这里有一个清晰的解释。还有snakefood一个可以为您完成所有工作(并且也使用 AST!)

您可能想要查看pylintpychecker更一般的维护任务。

于 2010-08-26T09:32:38.610 回答
4

编写一个执行此操作的脚本可能不会很复杂(尽管导入处理有不同的语法),

这是微不足道的。有importfrom module import。要处理的两种语法。

你知道我正在尝试做的更准确的术语吗?代码重组?

设计。这叫做设计。是的,您正在重构现有设计,但是...

规则一

不要用你所拥有的东西开始设计工作。如果你这样做了,你只会“在边缘啃”做一些小的,有时是无关紧要的改变。

规则二

如果您更聪明,您应该拥有的东西开始设计工作。广泛而清晰地思考你真正应该做什么。忽略你所做的。

规则三

使用正确的包和模块架构从头开始设计(或像某些人所说的从头开始)。

为此创建一个单独的项目。

规则四

先测试。为您的新架构编写单元测试。如果您有现有的单元测试,请将它们复制到新项目中。修改导入以反映新架构并重写测试以表达您光荣的新简化。

所有的测试都失败了,因为你没有移动任何代码。这是好事。

规则五

最后将代码移动到新结构中。测试通过时停止移动代码。

顺便说一句,您不需要分析导入来执行此操作。您只是grep用来查找模块和类。旧进口和旧进口之间的纠结关系无关紧要,无需分析。你把它扔掉了。您不需要比grep.

如果有移动代码的冲动,你必须非常自律。(1)您必须有失败的测试,然后(2)您可以移动一些代码以通过失败的测试。

于 2010-08-26T10:28:59.343 回答
2

chuckmove是一个工具,可让您递归地重写整个源代码树中的导入以引用模块的新位置。

chuckmove --old sound.utils --new media.sound.utils src

...这会下降到 src,并将导入 sound.utils 的语句重写为导入 media.sound.utils。它支持所有 Python 导入格式。即from x import yimport x.y.z as w

于 2016-01-14T20:10:11.623 回答
1

Modulefinder 可能不适用于 Python 3.5*,但pydeps运行良好:

安装:

sudo apt install python-pygraphviz
pip install pydeps

然后,在您要映射的目录中,

pydeps --max-bacon=0 .

..创建最大深度的地图。

* Python 3.5 但不是 3.6 中的一个问题导致了 modulefinder 的问题,类似于这个

于 2018-09-27T12:35:08.313 回答