web-dev-qa-db-ja.com

pylint 1.4は、すべてのC拡張でE1101(非メンバー)を報告します

私たちはpylintの長年のファンです。その静的分析は、すべてのpythonプロジェクトの重要な部分となり、不明瞭なバグを追跡する時間を大幅に節約しました。メンバーなし)エラー。

以前はpylint 1.3で完全にクリーンに実行されていたプロジェクトが、E1101を持つほとんどすべてのC拡張メンバーについて文句を言います。 E1101エラーを無効にすることを余儀なくされましたが、これはpylintの有用性を実質的に損ないます。

たとえば、これはlxmlパッケージの完全に有効な使用法です

r"""valid.py: demonstrate pylint 1.4 error"""
from lxml import etree
print etree.Element('mydoc')

これをpylintで実行すると、レポートされます:

$ pylint -rn valid.py
No config file found, using default configuration
************* Module valid
E:  3, 6: Module 'lxml.etree' has no 'Element' member (no-member)

しかし、それは完全に有効です:

$ python valid.py
<Element mydoc at 7fddf67b1ba8>

ここが本当に奇妙なところです。非常に少数のC拡張機能は、pylintを介して正常に機能するようです。例:

r"""valid2.py: this one works fine"""
import sqlite3
print sqlite3.version

$ pylint -rn valid2.py
No config file found, using default configuration

私の質問は、他の誰かがこれを目撃しましたか?もしそうなら、あなたはあなたの回避策/解決策を共有しても構わないと思いますか?

これらの警告を抑制するプラグインを作成しようと試みました( http://docs.pylint.org/plugins.html#enter-plugin )が、頭や尾を作るのが困難ですのドキュメント-およびastroid基本クラスは非常に複雑であり、私たちの試みを無視しました。

実際のボーナスポイント(および永遠の感謝)については、pylintの変更点を理解したいと思います。 pylintを満たすコードを修正する(または、少なくともC拡張機能の作成者向けのベストプラクティスドキュメントを公開する)ことができれば幸いです。

プラットフォームの詳細

$ pylint --version
No config file found, using default configuration
pylint 1.4.0,
astroid 1.3.2, common 0.63.2
Python 2.7.5 (default, Jul  1 2013, 18:09:11)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)]
46
user590028

質問を投稿してまもなく、答えを見つけました。実際には、セキュリティ対策として意図的に変更が行われました。 Pylintはモジュールをインポートして、有効なメソッドと属性を効果的に識別します。 python stdlibの一部ではないc拡張機能のインポートはセキュリティリスクであり、悪意のあるコードを導入する可能性があると判断されました。

これはAstroid 1.3.1のリリースで行われました https://mail.python.org/pipermail/code-quality/2014-November/000394.html

信頼できるソース(標準ライブラリ)のC拡張のみが、ライブモジュールからPythonを構築するための検査プロセスASTに読み込まれます。

非stdlib c拡張機能をインポートするプロジェクトでpylintを使用する場合、4つのソリューションがあります。

1)--unsafe-load-any-extension=yコマンドラインオプションを使用して安全性を無効にします。この機能は文書化されておらず、非表示オプションとして分類されています( https://mail.python.org/pipermail/code-quality/2014-November/000439.html )。

2)pylint.rc設定unsafe-load-any-extensions=yesを使用して安全を無効にします。これはオプション1よりも推奨され、デフォルトのpylint.rcファイル(--generate-rcfileで作成)に完全なドキュメントが含まれています。

3)pylint.rcオプションを使用して、extension-pkg-whitelist=ファイルにpylintによってロードされると信頼するパッケージまたはモジュール名を具体的にリストします。

4)ASTを操作するプラグインを作成します(これを実現する方法はわかりませんが、pylintメーリングリストで定期的に議論されています)。

オプション3を選択しました。プロジェクトpylint.rcファイルに次の行を追加しました。

extension-pkg-whitelist=lxml
62
user590028

@ user590028、ご回答ありがとうございます!ライブラリwin32api、win32evtlog、win32file、win32gui、win32processでこの同じ問題に遭遇したところ、ソリューションは機能しました。

ここに投稿する価値があると思う別の方法を使用しました。これは、pylintを呼び出し、ホワイトリストに登録されたパッケージをパラメーターとして渡すことです。

pylint --extension-pkg-whitelist=win32api,win32evtlog,win32file,win32gui,win32process myfile.py
7
twasbrillig

VS Codeを使用している人にとっては、実行可能ファイルが見つからなかったため、コマンドを配置する場所を見つけるのは少し難しいです。

VSコードでは;

  1. [ファイル]> [設定]> [設定]をクリックします。
  2. 左ウィンドウの「Python Configurations」まで下にスクロールします
  3. 右ウィンドウの「Python Linting:Mypy Args」までスクロールします
  4. 「settings.jsonで編集」リンクをクリックします
  5. jsonを編集して、「-extension-pkg-whitelist = "

PyLintはWindowsコマンドラインから実行できないため、これをすべて行う必要がありました...

4
BlakcRece

VS Code for Macを使用している場合、これはsettings.jsonファイルを編集するために必要なことです。

  1. [コード]をクリックします(つまり、[ファイル]タブの左側にある[Visual Studioコード]タブ)-> [設定]-> [設定]
  2. [拡張機能]までスクロールし、リストの[Python]をクリックします。
  3. Edit in settings.jsonリンクのいずれかをクリックします。これにより、settings.jsonが編集用に開きます。
  4. "python.linting.pylintArgs": ["----extension-pkg-whitelist=1xml"]を追加します。
0
Fritz Lim