我目前正在使用pylint,当我抓住单个文件时,我收到了一个错误(下面的repro)。我使用的是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仍然抱怨它。下面的相关输出(为简洁而减少)......
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
(常见的是包中的另一个模块),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)]
答案 0 :(得分:2)
您正在使用尚未支持declare_namespace
for creating namespaces的Pylint版本。您使用的pylint / astroid的版本是什么?
有关类似问题,请参阅https://github.com/PyCQA/pylint/issues/687,并链接到支持此命名空间创建的代码。
请记住,Pylint实际上并不在分析期间运行Python代码,因此必须通过编写自定义代码来支持大多数非标准(不可推断)构造。