在 Python 中映射模块导入以方便重构

问题描述 投票:0回答:4

我有一堆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 个模块)

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

你知道有什么工具(甚至是简单的脚本)可以帮助代码重组吗?

你知道我想要做的事情有更准确的术语吗?代码重组?

python refactoring module python-module
4个回答
16
投票

Python 的

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

您可能需要查看

pylint
pychecker
以了解更一般的维护任务。


4
投票

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

这是微不足道的。 有

import
from module import
。 需要处理两种语法。

你知道我想要做的事情有更准确的术语吗?代码重组?

设计。 这就是所谓的“设计”。 是的,您正在重构现有设计,但是...

规则一

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

规则二

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

规则三 使用正确的包和模块架构

从头开始设计

(或像某些人所说的从头开始)。

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

规则四

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

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

第五条

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

顺便说一句,您不需要分析导入来执行此操作。 您只需使用

grep 来查找模块和类。 旧的导入以及旧的导入之间的纠结关系并不重要,不需要分析。 你把它扔掉了。 您不需要比 grep

更智能的工具。

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


chuckmove

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

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

2
投票
...这会下降到 src,并将 import sound.utils 的语句重写为 import media.sound.utils。它支持所有 Python 导入格式。 IE。

from x import yimport x.y.z as w

    

Modulefinder 可能不适用于 Python 3.5*,但 
pydeps
 工作得很好:

安装:

1
投票
sudo apt install python-pygraphviz pip install pydeps

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

pydeps --max-bacon=0 .

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

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

this

    

© www.soinside.com 2019 - 2024. All rights reserved.