为什么 pylint 找不到这个包的模块?

Why is pylint unable to find this package's module(s)?

我目前正在使用 pylint,当我对单个文件进行 lint 时出现错误(下面的重现)。我正在使用 azure sdk,但这只是我引用的包,在这里应该不重要。

复制

$ mkdir pylinttesting && cd pylinttesting
$ python3 -m venv venv
$ . venv/bin/activate
$ pip3 install azure==2.0.0rc6
$ echo 'from azure import mgmt' > app.py

运行 这个脚本文件没有问题 (python3 app.py)

pylint 输出

即使这完全有效并且 runs/imports 没有错误,pylint 仍然抱怨它。下面的相关输出(为简洁起见被删减)...

E:  1, 0: No name 'mgmt' in module 'azure' (no-name-in-module)

External dependencies
---------------------
::

    azure (app)

但是!如果我 运行 这个小片段(在同一个虚拟环境中)...

import os
import pkgutil
import azure

package_path = os.path.dirname(azure.__file__)
[print(name) for _, name, _ in pkgutil.iter_modules([package_path])]

...我得到以下输出...

batch
common
mgmt
servicebus
servicemanagement
storage

显然 mgmt 模块位于 azure 包中。但我想知道为什么 pylint 不接受它?

同样值得注意的是,如果我这样做 from azure import common(common 是包中的另一个模块),pylint 不会抛出错误。

关于为什么 pylint 可能对包中的这个 mgmt 模块不满意有什么想法吗?

编辑:pylint版本信息...

pylint 1.6.5, 
astroid 1.4.9
Python 3.6.0 (default, Dec 24 2016, 00:01:50) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]

您使用的 Pylint 版本(尚)不支持 declare_namespace for creating namespaces。你用的pylint/astroid是什么版本?

有关类似问题,请参阅 https://github.com/PyCQA/pylint/issues/687,有关支持此命名空间创建的代码,请参阅 link。

请记住,Pylint 在分析过程中实际上不会 运行 Python 代码,因此大多数非标准(不可推断的)构造必须通过编写自定义代码来支持。