我有一个自定义模块加载程序,它基本上可以执行一些重定向。我希望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可能会理解这一点,要么是由于其他人为此目的贡献了一个插件。