消除通配符导入的工具

22

我正在对一些相当庞大的代码进行重构和消除通配符导入。

Pylint似乎在列出所有随通配符导入而来的未使用导入方面做得很好,但我希望它提供一个已使用导入的列表,这样我就可以快速地替换通配符导入。有没有快速的方法可以做到这一点?我将要解析pyLint的输出,并对其与导入模块的dir()进行set.difference()。但我敢打赌还有一些我不知道的工具/程序。


1
你尝试过查找__all__吗? - Jakob Bowyer
很好的问题!我希望有这样的东西。pyflakes可能可以被修改以尝试忽略通配符行并重新解析,生成一个未定义名称列表。但我目前不知道任何自动执行此操作的工具。 :c - Corbin
1
在使用 Eclipse 的 PyDev 时,它会显示未使用的导入(即使是使用通配符导入的)。 - JBernardo
1
那么,我们只需移除通配符导入并导入所有现在用蓝色波浪线标出的模块如何? - inspectorG4dget
3个回答

8
注意:pylint不建议使用一组导入。在更改此内容时,您必须注意其他导入正在导入您正在修改的代码,这些导入可能使用属于您正在重构的模块命名空间的符号,仅因为您有未使用的导入。
我建议按照以下步骤重构from foo import *:
  • in an interactive shell, type:

    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)])
    
  • replace the from foo import * line with the one printed above

  • run pylint, and remove the unused imports flagged by pylint
  • run pylint again on the whole code based, looking for imports of non existing sympols
  • run your unit tests

使用from bar import *进行重复操作


5

0
这是一个老问题,但我基于autoflake编写了一些代码来实现这个功能。
请参见此处:https://github.com/fake-name/autoflake/blob/master/autostar.py 它的工作方式与dewildcard相反,它试图完全限定通配符项的所有用途。
例如:
from os.path import *

被转换为

import os.path

所有使用os.path.<func>的地方都需要添加正确的函数名作为前缀。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接