26

我最近的任务是维护一堆使用量from module import *相当大的代码。

这个代码库已经变得足够大,以至于导入冲突/命名模糊/“这个函数到底是从哪里来的,好像有八个导入的模块有一个同名?!”主义变得越来越普遍。

展望未来,我一直在使用显式成员(即import module ... module.object.function(),使我所做的维护工作更具可读性。

但我想知道:是否有一个 IDE 或实用程序可以健壮地解析 Python 代码并将 * import 语句重构为模块 import 语句,然后将完整的模块路径添加到对该模块成员的所有引用上?

我们没有inspect大量使用元编程/反射//monkeypatching,所以如果前面的 IDE/util 在这些事情上表现不佳,那没关系。

4

3 回答 3

4

不是一个完美的解决方案,但我通常做的是:

  1. 打开 Pydev
  2. 删除所有*导入
  3. 使用optimize imports命令 ( ctrl+shift+o) 重新添加所有导入

大致解决问题:)


如果您想自己构建解决方案,请尝试http://docs.python.org/library/modulefinder.html

于 2012-10-07T12:34:01.473 回答
3

以下是提到的其他相关工具:

更多关于皮林特

pylint是一个非常好的工具ast,它已经能够告诉你代码中哪里有from somemodule import *语句,以及告诉你哪些导入是不必要的。

例子:

# next is what's on line 32
from re import *

这会抱怨:

W: 32,0: Wildcard import re
W: 32,0: Unused import finditer from wildcard import
W: 32,0: Unused import LOCALE from wildcard import
... # this is a long list ...

寻求解决方案?

请注意,在上面的输出pylint中为您提供了行号。这可能需要一些努力,但是重构工具可以查看那些特定的警告,获取行号,导入模块并查看__all__列表,或者使用沙盒execfile()语句查看模块的全局名称(这会modulefinder有所帮助吗?也许吧。 ..)。使用来自的全局名称列表和抱怨__all__的名称,您可以拥有两个并继续获得差异。将具有通配符导入的行替换为特定导入。pylintset()

于 2012-10-14T02:06:19.973 回答
0

为此,我编写了一些重构工具。Star Namer将检查所有通配符*导入的脚本,并将它们替换为要导入的实际函数。

用法:./star_namer.py module_filename script_filename


将所有星形导入转换为实际名称后,您可以使用from_to_import.py来修复它们。这是它的工作原理:

  1. 通过pylint运行脚本并计算所有当前未定义的单词。

  2. from modname import从脚本中删除所有行。

  3. 再次通过 pylint 运行脚本并比较未定义单词的差异。

  4. 通过 pylint 的json输出(以相反的顺序),它确定要进行替换的确切位置并将其插入modname.正确的位置。

我认为这种方法会更加健壮,通过将语法处理卸载到为其设计的高级实用程序,而不是尝试使用正则表达式自己遍历所有文本。

用法:from_to_import.py script_name modname

它将向您显示在进行更改之前要进行哪些更改。按y保存。到目前为止,我发现的主要问题是插入modname.文本导致的文本对齐问题,这会使注释未对齐,并且不能很好地处理别名函数名(from ... import quickrun as qrun)

此处的完整文档:https ://github.com/SurpriseDog/Star-Wrangler

于 2021-10-11T17:08:41.770 回答