我有一堆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个模块一起工作)
编写一个执行此操作的脚本可能不会非常复杂(虽然有不同的语法可供导入处理),但我也希望我不是第一个想要这样做(如果有人为此制作了一个工具,它可能包括其他简洁的功能,比如告诉我可能没有使用哪些类和功能)。
您是否知道有助于代码重组的任何工具(甚至是简单的脚本)?
您是否知道我正在尝试做的更准确的术语?代码重组?
答案 0 :(得分:14)
Python的modulefinder
就是这么做的。编写一个将此信息转换为导入图形的脚本非常容易(您可以使用graphviz进行渲染):这里是clear explanation。还有snakefood
为你完成了所有的工作(并且也使用了AST!)
答案 1 :(得分:4)
编写执行此操作的脚本可能不会非常复杂(尽管有不同的语法可供导入处理),
这是微不足道的。有import
和from 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 y
,import x.y.z as w
等。
答案 3 :(得分:0)