【问题标题】:Having pylint recognize custom module loader让 pylint 识别自定义模块加载器
【发布时间】:2016-04-01 14:41:25
【问题描述】:

我有一个自定义模块加载器,它基本上会进行一些重定向。我希望 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 的一个问题。我可以让客户端代码毫无问题地识别自定义加载程序。

【问题讨论】:

标签: python pylint


【解决方案1】:

来自documentation on modules

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

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

__path__ = ["new"]

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

【讨论】:

  • 谢谢,这是替换我的自定义加载器的绝佳解决方案。但是皮林特还是不高兴。它无法识别__path__ 中的__init__.py 更改。看来这个问题是无法解决的,基于stackoverflow.com/q/5394786/1330434
  • 我认为您没有完全理解,您需要将 文件夹 替换为 old.py,如果这也不起作用,那么我不确定是什么建议。
  • 试过了。这会将错误从 No name 'foo' in module 'old' (no-name-in-module) 更改为 Unable to import 'old.foo' (import-error)
  • 好的,如果将from new import * 放在old.py 中不起作用,那么我就没有主意了。没有与 pylint 合作过,但祝你好运!
  • 不,这也不起作用。谢谢你的帮助。欣赏它。
【解决方案2】:

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

话虽如此:

  • 您仍然可以为 astroid(pylint 下的库)编写一个“大脑”插件,这将有助于 pylint 了解您的代码的特殊性

  • 通过依赖诸如__path__ 操作之类的标准机制,您将有更多机会避免这种需要,因为在某些时候 pylint 可能会理解这一点,或者因为其他人会为此目的贡献一个插件。

【讨论】:

    猜你喜欢
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2017-10-09
    • 2016-01-21
    • 1970-01-01
    相关资源
    最近更新 更多