使用Python导出映射模块以便于重构

时间:2010-08-26 09:18:15

标签: python refactoring module python-module

我有一堆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使用,因此可以删除等等。(我' m实际上与大约60个模块一起工作)

编写一个执行此操作的脚本可能不会非常复杂(虽然有不同的语法可供导入处理),但我也希望我不是第一个想要这样做(如果有人为此制作了一个工具,它可能包括其他简洁的功能,比如告诉我可能没有使用哪些类和功能)。

您是否知道有助于代码重组的任何工具(甚至是简单的脚本)?

您是否知道我正在尝试做的更准确的术语?代码重组?

4 个答案:

答案 0 :(得分:14)

Python的modulefinder就是这么做的。编写一个将此信息转换为导入图形的脚本非常容易(您可以使用graphviz进行渲染):这里是clear explanation。还有snakefood为你完成了所有的工作(并且也使用了AST!)

您可能需要查看pylintpychecker以了解更多常规维护任务。

答案 1 :(得分:4)

  

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

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

  

您是否知道我正在尝试做的更准确的术语?代码重组?

设计。它被称为设计。是的,你正在重构现有的设计,但是......

第一条

不要用你拥有的东西开始设计工作。如果你这样做,你只会“蚕食边缘”,做出小的,有时是无关紧要的变化。

第二条

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

规则三

使用正确的包和模块架构从头开始设计 (或 de novo ,正如一些人所说)。

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

规则四

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

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

规则五

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

您不需要分析导入来执行此操作,BTW。您只是使用grep来查找模块和类。旧的进口和旧进口之间纠缠不清的关系并不重要,也不需要进行分析。你扔掉了。您不需要比grep更智能的工具。

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

答案 2 :(得分: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等。

答案 3 :(得分:0)

Modulefinder可能不适用于Python 3.5 *,但是pydeps表现很好:

安装:

sudo apt install python-pygraphviz
pip install pydeps

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

pydeps --max-bacon=0 .

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

* Python 3.5(而非3.6)中的一个问题导致modulefinder出现问题,类似于this