22

我正在重构和消除一些相当单一的代码上的通配符导入。

Pylint 似乎在列出所有未使用的导入以及通配符导入方面做得很好,但我希望它提供一个使用过的导入列表,以便我可以快速替换通配符导入。有什么快速的方法吗?我将要解析 pyLint 的输出并对set.difference()这个和dir()导入的模块做一个。但我敢打赌,有一些我不知道的工具/程序。

4

3 回答 3

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 *

于 2011-08-31T08:19:55.677 回答
5

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

https://github.com/quentinsf/dewildcard

于 2015-08-26T16:16:31.750 回答
0

这是一个老问题,但我写了一些基于 autoflake 的东西。

见这里:https ://github.com/fake-name/autoflake/blob/master/autostar.py

它与 dewildcard 的工作方式相反,因为它试图完全限定通配符项目的所有用途

例如

from os.path import *

转换为

import os.path

并且所有用法os.path.<func>都以适当的功能为前缀。

于 2019-07-09T00:35:35.217 回答