让pylint识别自定义模块加载器

时间:2016-04-01 14:41:25

标签: python pylint

我有一个自定义模块加载器,基本上可以进行一些重定向。我想pylint识别这个自定义加载器。这是我的情况:

root/
    __init__.py
    new/
        __init__.py
        foo.py
        bar.py
    old/
        __init__.py

我有很多客户导入old.foo。我在old/__init__.py中编写了一个自定义加载程序,将这些加载项重定向到导入new.foo。如何让pylint识别出来?当它提示import old.foo时,它会抱怨它无法找到old.foo。这只是pylint的一个问题。我可以获得客户端代码来识别自定义加载器而没有任何问题。

2 个答案:

答案 0 :(得分:1)

来自documentation on modules

  

Packages支持另一个特殊属性__path__。这被初始化为一个列表,其中包含在执行该文件中的代码之前保存包__init__.py的目录的名称。这个变量可以修改;这样做会影响将来对包中包含的模块和子包的搜索。

因此,如果我理解正确,您希望将对old的任何引用重定向到重定向到new,那么您需要做的就是将old文件夹替换为old.py包含这个:

__path__ = ["new"]

然后,当有任何内容尝试导入old.foo时,它最终会导入new.foo

答案 1 :(得分:0)

你必须记住,pylint是一个静态分析器,因此实际上并没有加载python文件(除非在某些情况下它不能这样做,例如编译代码)。因此,它不知道自定义导入器或其他技巧参与python的高动态性。

话虽如此:

  • 你仍然可以写一个"大脑" astroid(pylint下的库)的插件,可帮助pylint理解您的代码的特异性

  • 依靠__path__操纵等标准机制,您将有更多机会避免此类需求,因为在某些时候,pylint可能会理解这一点,或者因为其他人会贡献一个插件为此目的。