私たちは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)]
質問を投稿してまもなく、答えを見つけました。実際には、セキュリティ対策として意図的に変更が行われました。 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
@ user590028、ご回答ありがとうございます!ライブラリwin32api、win32evtlog、win32file、win32gui、win32processでこの同じ問題に遭遇したところ、ソリューションは機能しました。
ここに投稿する価値があると思う別の方法を使用しました。これは、pylintを呼び出し、ホワイトリストに登録されたパッケージをパラメーターとして渡すことです。
pylint --extension-pkg-whitelist=win32api,win32evtlog,win32file,win32gui,win32process myfile.py
VS Codeを使用している人にとっては、実行可能ファイルが見つからなかったため、コマンドを配置する場所を見つけるのは少し難しいです。
VSコードでは;
PyLintはWindowsコマンドラインから実行できないため、これをすべて行う必要がありました...
VS Code for Macを使用している場合、これはsettings.jsonファイルを編集するために必要なことです。
Edit in settings.json
リンクのいずれかをクリックします。これにより、settings.json
が編集用に開きます。"python.linting.pylintArgs": ["----extension-pkg-whitelist=1xml"]
を追加します。