消除通配符导入的工具

22 投票
3 回答
4467 浏览
提问于 2025-04-17 00:46

我正在对一些比较庞大的代码进行重构,并且想要去掉通配符导入。

Pylint 这个工具在列出那些和通配符导入一起出现的未使用导入时做得很好,但我希望它能提供一个已使用导入的列表,这样我就可以快速替换掉通配符导入。有没有什么简单的方法可以做到这一点?我正准备去解析 Pylint 的输出,然后用 set.difference() 来对比这个输出和导入模块的 dir()。不过我觉得可能还有其他我不知道的工具或方法。

3 个回答

0

这是一个老问题,不过我写了一些东西,基于autoflake来实现这个功能。

可以查看这里:https://github.com/fake-name/autoflake/blob/master/autostar.py

它的工作方式和dewildcard正好相反,主要是试图将所有使用通配符的地方都写得更清楚。

比如说:

from os.path import *

会被转换成:

import os.path

并且所有使用了os.path.<func>的地方都会加上正确的函数前缀。

5

这是一个叫做dewildcard的工具,它非常简单,基于Alex最初的一些想法:

https://github.com/quentinsf/dewildcard

8

注意:pylint这个工具不建议使用一组固定的导入。当你改变这些导入时,要注意其他模块可能会引用你正在修改的代码,这可能会使用到你重构的模块中的符号,仅仅是因为你有一些未使用的导入。

我推荐以下步骤来重构 from foo import *

  • 在一个交互式的命令行中,输入:

    import re
    import foo as module # XXX use the correct module name here!
    
    module_name = module.__name__
    import_line = 'from %s import (%%s)' % module_name
    length = len(import_line) - 3
    print import_line % (',\n' + length * ' ').join([a for a in dir(module) 
                                                                   if not re.match('__.*[^_]{2}', a)])
    
  • from foo import * 这一行替换成上面打印出来的那一行

  • 运行pylint,删除pylint标记的未使用的导入
  • 再次在整个代码库上运行pylint,检查是否有导入不存在的符号
  • 运行你的单元测试

from bar import * 重复以上步骤

撰写回答