DjangoでPylintを使用する


140

私は統合するだろう非常に多くのようなpylintを私のpythonプロジェクトのビルドプロセスに、しかし、私は1つのショーストッパーに実行した:私は非常にuseful--見つけること、エラーの種類の一つは:E1101: *%s %r has no %r member*一般的なDjangoのフィールドを使用しているとき--constantlyエラーを報告します、 例えば:

E1101:125:get_user_tags: Class 'Tag' has no 'objects' member

これはこのコードによって引き起こされます:

def get_user_tags(username):
   """
   Gets all the tags that username has used.

   Returns a query set.
   """
   return Tag.objects.filter(  ## This line triggers the error.
       tagownership__users__username__exact=username).distinct()

# Here is the Tag class, models.Model is provided by Django:
class Tag(models.Model):
   """
   Model for user-defined strings that help categorize Events on
   on a per-user basis.
   """
   name = models.CharField(max_length=500, null=False, unique=True)

   def __unicode__(self):
       return self.name

Pylintを調整して、オブジェクトなどのフィールドを適切に考慮するにはどうすればよいですか?(私はDjangoのソースも調べましたが、の実装を見つけることができなかったので、objectsそれがクラスフィールドの「単なる」ではないのではないかと思います。一方、私はPythonにかなり慣れていないので、何かを見落としている可能性があります。)

編集:これらの警告について警告しないようにpylintに指示した唯一の方法は、許容できる解決策ではないタイプ(E1101)のすべてのエラーをブロックすることです。これは(私の意見では)非常に有用なエラーであるためです。別の方法がある場合は、pylintソースを拡張せずに、詳細を教えてください:)

参照してくださいここで私が持っていた問題の概要については、pycheckerpyflakes彼らは一般的な使用のためにはるかに不安定にあることが証明されました- 。(pycheckerの場合、クラッシュはpycheckerコードが原因で発生し、ロード/呼び出し元ではありませんでした。)


4
最新の回答については、@ talweissの投稿をご覧ください。
ブレンダン2015


1
@talweissの回答を受け入れてもらえますか?これは、最新の正しいソリューションです。
Vijay Varadan 2017

回答:


155

無効にしないでくださいまたは追加することによって、Pylintの機能を弱めますignoresgenerated-members。Django
理解するアクティブに開発されたPylintプラグインを使用してください。
このDjango用Pylintプラグインは非常にうまく機能します。

pip install pylint-django

そして、pylintを実行するときは、次のフラグをコマンドに追加します。

--load-plugins pylint_django

詳細なブログ投稿はこちら


2
ブログ投稿へのリンクは死んでいます(すぐに)。ここからいくつかのアーカイブのリンクありインターネットアーカイブからのarchive.is
クリスチャン・ロング

3
Sublime TextのSublimeLinterプラグインで機能させるには、--load-plugins=pylint_djangolinters / pylint / args設定に追加する必要がありました。「=」記号に注意してください。これがないと機能しませんでした。
Dennis Golomazov 2015年

それは動作しません。私はこのエラーを受け取ります:E:8、0:モジュール 'django.db'に名前 'models'はありません(no-name-in-module)
最大

6
また、あなたのpylintrcでこれを追加することができます:[MASTER] load-plugins=pylint_django
azmeuk

3
vsコードでは、ユーザー設定で次のように入力するまで機能しません{"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],} 。tieuminh2510の回答
ali-myousefi

63

私は以下を使用します: pylint --generated-members=objects


TYPECHECKの下のman pylint(1)--generated-members=<members names>動的に設定され、pylint推論システムによって失われたメンバーのリスト。したがって、アクセス時にE0201 およびE1101をトリガーしません。[current:REQUEST、acl_users、aq_parent]
Mark Mikofski

これをPyDev / PyLintセクションの設定の下のEclipseのPyDevに追加します。
Mark Mikofski、2012年

2
生成されたメンバーを使用すると、これらのエラーが表示されなくなります。間違ったオブジェクトのオブジェクトフィールドにアクセスしようとすると、エラーが発生する可能性があります。代わりに、pylint-djangoプラグインを使用してください。
Vajk Hermecz、2015

5
これはPylintを修正するための間違った方法です-その機能の一部を無効にすることによって。Django を理解するPylintプラグインをインストールするだけです。stackoverflow.com/a/31000713/78234を
Tal Weiss

31

〜/ .pylintrcには

[TYPECHECK]
generated-members=REQUEST,acl_users,aq_parent,objects,_meta,id

最後の2つはDjango専用です。

PyLint 0.21.1にはバグがあり、これを機能させるにはパッチが必要です。

編集:これをもう少しいじってから、PyLintをほんの少しハックして、上記を次のように拡張できるようにしました。

[TYPECHECK]
generated-members=REQUEST,acl_users,aq_parent,objects,_meta,id,[a-zA-Z]+_set

私は単に追加しました:

    import re
    for pattern in self.config.generated_members:
        if re.match(pattern, node.attrname):
            return

バグレポートに記載されている修正後(つまり、129行目)。

幸せな日々!


パッチをpylintに提出して、メンテナに返送してください。
滑らかな

実際には、このパッチは0.24に含まれていますが、shlexパッケージの使用を開始しており、現在は他のものを壊しています。gen.wordchars += "[]-+"それを機能させるために、135行目に追加する必要がありました...
simon

4
生成されたメンバーを使用すると、これらのエラーが表示されなくなります。間違ったオブジェクトの「オブジェクト」フィールドにアクセスしようとすると、エラーが発生する可能性があります。代わりに、pylint-djangoプラグインを使用してください。
Vajk Hermecz、2015

4
これはPylintを修正するための間違った方法です-その機能の一部を無効にすることによって。Django を理解するPylintプラグインをインストールするだけです。stackoverflow.com/a/31000713/78234を
Tal Weiss

3
@TalWeiss-公平に言うと、この回答はから3年古いpylint-djangoので、反対票は少し厳しいです
simon

27

Visual Studio Codeを使用する場合は、次のようにします。

pip install pylint-django

そしてVSC設定に追加します:

"python.linting.pylintArgs": [
    "--load-plugins=pylint_django"
],

2
これまでで最高の応答:D
serfer2 '10 / 09/19

19

django-lintは、pylintをdjango固有の設定でラップする素晴らしいツールです。http://chris-lamb.co.uk/projects/django-lint/

githubプロジェクト:https : //github.com/lamby/django-lint


1
私はDjango固有のpylintのアイデアが好きですが、前回試したときは非常にバグが多いようです。
2010

3
また、PyPI経由では利用できず、ウェブサイトは次のような十分な情報を提供していないようです:現在のバージョンは何ですか?
2010

1
コンセプトは気に入っていますが、この実装は中途半端なもので、適度なサイズのコードベースでは機能しません。実際に役立つようになるまでには長い道のりがあります。
セリン2011

1
@gurneyアレックス、リンクは死んだ。
シャトル87 2015年

2
pylint-djangoがよりアクティブになったようです。これが推奨される解決策です。
Vajk Hermecz、2015

16

pylintがどのように機能するか(Pythonに実際に実行させずにソース自体を検査するため)、メタクラスと複雑なベースクラスが実際にクラスとそのインスタンスにどのように影響するかをpylintが理解するのは非常に困難です。'pychecker'ツールは、Python 実際にコードを実行できるようにするため、この点で少し優れてます。モジュールをインポートし、結果のオブジェクトを調べます。ただし、この方法には実際にPythonにコードを実行させるため、他の問題があります:-)

Pylintを拡張して、Djangoが使用する魔法について教えたり、メタクラスや複雑なベースクラスをよりよく理解させたり、理解できない1つ以上の機能を検出した後にそのような場合を無視したりすることができます。特に簡単だとは思いません。ソースの特別なコメント、コマンドラインオプション、または.pylintrcファイルを使用して、これらのことについて警告しないようにpylintに指示することもできます。


3
DjangoについてPylintを教えるのは簡単ではありませんが、それは完了しています。Djangoを理解するPylintプラグインをインストールするだけです。stackoverflow.com/a/31000713/78234を
Tal Weiss

まあ私はそれをインストールしましたが、それでもQuerySetのようなシンに関する削除は削除されていません...
EinoMäkitaloJun

7

Djangoコードでpyflakesを使用することを優先して、pylint / pycheckerの使用を辞退しました。モジュールをインポートしようとして、未使用のインポートや初期化されていないローカル名など、見つかった問題を報告します。


面白い-pyflakesをもう一度見てみる。
rcreswick 2008

2
PyCheckerは、pylintよりもはるかに少ない数をキャッチします。doughellmann.com/articles/CompletelyDifferent-2008-03-linters/...
ジャスティンAbrahms

1
Pylintをあきらめる必要はありません-Djangoを理解するPylintプラグインをインストールするだけです。stackoverflow.com/a/31000713/78234を
Tal Weiss

7

これは解決策ではありませんが、objects = models.Manager()動作を変更せずにDjangoモデルに追加できます。

私自身はpyflakesのみを使用していますが、これは主に、パイリントの怠惰なデフォルトと怠惰な部分が原因です(デフォルトの変更方法を調べたくありません)。


ああ…先端をありがとう。私はそれをdjangoソースのローカルコピーのModel.modelsに追加してみて、それがうまくいくかどうかを確認するかもしれません。
rcreswick 2008

警告について妥協しないので、これは素晴らしい解決策だと思います。
トムレイ

1
これは悪い解決策です。自分自身を繰り返して実行可能なものを置き換えると、後で変更され(したがって、QA問題が発生します)、不完全なQAツールを修正するだけですか?
Chris Morgan

2
私はこれを悪い解決策とは言いません。明示的は暗黙的よりも優れています。objectsとにかく、魔法のように追加すべきではないでしょう。
ウィルハーディ

1
これはPylintを修正するための間違った方法だと思います-ある意味でDjangoにパッチを当てることによって。Django を理解するPylintプラグインをインストールするだけです。stackoverflow.com/a/31000713/78234を
Tal Weiss

5

でpylintを実行してみてください

pylint --ignored-classes=Tags

それが機能する場合は、他のすべてのDjangoクラスを追加します。おそらくpython:Pなどのスクリプトを使用します。

のドキュメント--ignore-classesは次のとおりです。

--ignored-classes=<members names>
メンバー属性をチェックしてはならないクラス名のリスト(動的に設定された属性を持つクラスに役立ちます)。[現在:%default]

これは私の見解では特にエレガントな解決策ではありませんが、機能するはずです。


これらのクラスでエラーが発生しない場合にのみ機能します;)。可能な限りコードを無視しないようにしたいのですが、コードベースのさまざまな部分にさまざまな程度の精査を分析させるのは非常に悪い考えだと思います。私はどちらがどれかを忘れて、デバッグ時に誤った仮定をします
rcreswick '22

1
これはPylintを修正するための間違った方法です-その機能の一部を無効にすることによって。Django を理解するPylintプラグインをインストールするだけです。stackoverflow.com/a/31000713/78234を
Tal Weiss


1

これまでのところ、私はそれに対する実際の解決策を見つけていませんが、回避します:

  • 弊社では、パイリントスコア> 8が必要です。これにより、コードがあまりにも「異常」にならないようにしながら、コーディングプラクティスをパイリントが理解できなくなります。これまでのところ、E1101が8以上のスコアに到達できなかった例はありませんでした。
  • 'make check'ターゲットは、「for has no 'objects' member」メッセージをフィルターで除外して、pylintがDjangoを理解していないことに起因するほとんどの注意散漫を取り除きます。

0

以下のためのneovim & vim8使用のw0rp's aleプラグイン。w0rp's alepylint&を含むすべてを正しくインストールした場合pylint-django。あなたにはvimrc、追加の次の行&ジャンゴを使用してWebアプリケーションを開発する楽しみを持っています。ありがとう。

let g:ale_python_pylint_options = '--load-plugins pylint_django'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.