【问题标题】:Why is pylint unable to find this package's module(s)?为什么 pylint 找不到这个包的模块?
【发布时间】:2017-03-28 21:25:53
【问题描述】:

我目前正在使用 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 输出

即使这是完全有效的并且运行/导入没有错误,pylint 仍然抱怨它。下面的相关输出(为简洁起见)...

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

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

    azure (app)

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

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 模块不满意有什么想法吗?

EDIT: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)]

【问题讨论】:

    标签: python pylint


    【解决方案1】:

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

    请参阅https://github.com/PyCQA/pylint/issues/687 了解类似问题和支持此命名空间创建的代码的链接。

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

    【讨论】:

    • 我已将 pylint 版本信息添加到问题中。那么这里没有“解决方法”吗?我想我可以忽略这条规则..?或者我可以从 github 克隆以获得支持这个的明显分支..?如果我正确的话,似乎这些是我的选择?感谢您的回答!
    • @ThomasStringer 是的,这是有问题的 - Pylint 不执行 Python 代码,因此它没有机会知道引擎盖下发生了什么。必须在 Pylint 的代码中明确实现对这种结构的理解。虽然此功能已准备就绪,但似乎尚未发布。我们计划尽快发布 1.7.0,但在那之前,如果您想拥有它,您需要使用存储库主分支中的 pylintastroid
    • 完美! pylint 1.7 和小行星 1.5 就像一个魅力!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多