让pylint识别自定义模块加载程序



我有一个自定义模块加载程序,它基本上可以执行一些重定向。我希望Pyint能够识别这个自定义加载程序。这就是我的处境:

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

我有很多客户端正在导入old.foo。我在old/__init__.py中编写了一个自定义加载程序,将它们重定向到后台导入new.foo。我该如何让皮林认识到这一点?当它到达import old.foo时,它抱怨找不到old.foo。这只是pylint的问题。我可以让客户端代码识别自定义加载程序,而不会出现任何问题。

来自模块文档:

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

因此,如果我理解正确,您希望将任何引用重定向到old以重定向到new,因此您所需要做的就是将old文件夹替换为包含以下内容的old.py

__path__ = ["new"]

然后,当任何东西试图导入old.foo时,它将最终导入new.foo

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

话虽如此:

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

  • 通过依赖__path__操作等标准机制,您将有更多机会避免这种需求,要么是因为在某个时候Pyint可能会理解这一点,要么是由于其他人为此目的贡献了一个插件。

最新更新