在Python中映射模块导入以便于重构
我有一堆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 个回答
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
等等。
写一个这样的脚本其实并不复杂(不过有不同的导入语法需要处理),
这很简单。 有 import
和 from module import
两种语法需要处理。
你知道我想做的事情有没有更准确的说法吗?代码重组?
设计。 这叫做 设计。 是的,你是在重新整理一个已有的设计,但是……
规则一
不要从你现在的设计开始。 如果这样做,你只会“边缘化”地做一些小改动,有时这些改动甚至没什么意义。
规则二
从你 应该 有的设计开始,假如你当初聪明一点的话。 广泛而清晰地思考你 真正 应该做的事情。 忽略你之前的做法。
规则三
从零开始设计(或者有些人说的 de novo),用正确的包和模块架构。
为此创建一个单独的项目。
规则四
先测试。 为你的新架构写单元测试。 如果你有现成的单元测试,可以把它们复制到新项目里。 修改导入语句以适应新架构,并重写测试以展示你辉煌的新简化。
所有测试都会失败,因为你还没有移动任何代码。 这其实是件好事。
规则五
最后再把代码移到新结构里。 当测试通过时就停止移动代码。
顺便说一下,你不需要分析导入来做到这一点。 你只需要用 grep
找到模块和类。 旧的导入和它们之间复杂的关系并不重要,也不需要分析。 你是要把这些都扔掉。 你不需要比 grep
更聪明的工具。
如果你有想要移动代码的冲动,你必须非常有纪律。 (1) 你必须有失败的测试,然后 (2) 你才能移动一些代码来通过这些失败的测试。