我有一个自定义模块加载器,基本上可以进行一些重定向。我想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的一个问题。我可以获得客户端代码来识别自定义加载器而没有任何问题。
答案 0 :(得分:1)
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可能会理解这一点,或者因为其他人会贡献一个插件为此目的。