确定对象和数据成员在另一个模块中的使用/创建

时间:2016-02-16 09:14:47

标签: python performance python-2.7 python-3.x design-patterns

在遗留系统中,我们创建了加载信息并由各种模块使用的init模块(import语句)。它是一个耗费更多内存,处理时间更长的大模块,直到现在还不需要或不使用某些信息。有两个建议的解决方案。

  1. 我们可以在Python中确定谁在使用这个模块.Fox示例 LoadData.py(init模块) 包含100个数据成员 A.py
    导入LoadData b = LoadData.name

    B.py 导入LoadData b = LoadData.width

    在上面的例子中,A.py使用name和B.py使用宽度和休息信息不是必需的(不需要98个数据成员)。 无论如何,这有助于我们确定LoadData模块的使用以及数据成员的使用。

  2. 简单来说,我们需要遍历A.py和B.py并手动查找以识别对象的使用情况。

  3. 我正在尝试实现第一个解决方案,因为我有超过1000个模块,通过遍历每个模块来确定是很痛苦的。我对任何可以集成到python

    的工具持开放态度

1 个答案:

答案 0 :(得分:1)

你的问题很广泛,所以我无法给你一个确切的答案。但是,我通常会在整个代码库中运行类似flake8的linter来向您显示未使用的导入的位置,以及文件中是否有对未导入的内容的引用。 不会告诉您整个文件是否从未被任何内容导入,但是如果删除所有未使用的导入,则可以在代码库中搜索特定模块的导入,如果没有找到,则可以(相对)安全地删除该模块。

您可以将flake8等工具与大多数优秀的文本编辑器集成在一起,以便实时突出显示错误。

当您尝试使用遗留代码时,运行该工具时很可能会出现很多错误,因为它会查找样式问题以及您提及的导入/使用问题类型。我建议将这些作为原则问题进行修复(因为它们本质上是非功能性的),然后确保在持续集成中运行flake8以避免回归。但是,您可以使用命令行参数禁用特定警告,这可能有助于您进行演示。

您可以开始做的另一件事,虽然产生结果需要更长的时间,但是在代码覆盖率打开的情况下编写和运行单元测试,因此您可以看到代码库中从未执行过的区域。然而,对于一个大型遗留项目,这可能很难!但是,它将帮助您更好地了解您在第1点中提到的属性用法。因为Python非常动态,所以静态分析只能为您提供有关atttribute使用的信息。

此外,请确保您使用的是版本控制工具(例如git),以便您可以跟踪所有更改并在出错时还原它们。