web-dev-qa-db-ja.com

DjangoでPylintを使用する

私は pylint をpythonプロジェクトのビルドプロセスに統合したいと思いますが、1つのショーストッパーに遭遇しました。非常に便利です-:E1101: *%s %r has no %r member*--共通のDjangoフィールドを使用すると、常にエラーを報告します。

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ソースを増やさずに、詳細を教えてください:)

pycheckerおよびpyflakesで発生した問題の概要については、 here を参照してください。これらは、一般的に使用するには不安定であることが証明されています。 (pycheckerの場合、クラッシュはpycheckerコードで発生しました。ロード/呼び出しであったソースではありません。)

134
rcreswick

ignoresまたはgenerated-membersを追加してPylint機能を無効にしたり弱めたりしないでください。
Djangoを理解する積極的に開発されたPylintプラグインを使用します。
Django用のこのPylintプラグイン は非常にうまく機能します。

pip install pylint-Django

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

--load-plugins pylint_Django

詳細なブログ投稿 こちら

141
Tal Weiss

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

63
Ivan Perez

私の〜/ .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行目)。

幸せな日々!

30
simon

Visual Studio Codeを使用する場合は、次を実行します。

pip install pylint-Django

そして、VSC configに追加します。

"python.linting.pylintArgs": [
    "--load-plugins=pylint_Django"
],
21
Thiago Falcao

Django-lintは、Django特定の設定: http://chris-lamb.co.uk/projects/Django-lint/ でパイリントをラップする素敵なツールです。

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

19
gurney alex

Pylintの動作方法(Pythonを実際に実行せずにソース自体を検査します)のため、pylintがメタクラスと複雑なベースクラスが実際にクラスとそのインスタンスにどのように影響するかを把握するのは非常に困難です。 「pychecker」ツールは、この点で少し優れていますdoes実際にPythonコードを実行します。モジュールをインポートし、結果のオブジェクトを検査します。実際にはPythonコードを実行させます:-)

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

16
Thomas Wouters

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

7
zgoda

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

私自身はパイフレークのみを使用します。これは主に、一部のパイリントの鈍いデフォルトと怠慢のためです(デフォルトの変更方法を調べたくない)。

7
AdamKG

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

pylint --ignored-classes=Tags

それが機能する場合、他のすべてのDjangoクラス-おそらくスクリプトを使用して、たとえばpython:P

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

--ignored-classes=<members names>
メンバー属性をチェックしないクラス名のリスト(属性が動的に設定されているクラスに有用)。 [現在:%default]

私の意見では、これは特にエレガントなソリューションではありませんが、機能するはずです。

5
freespace

これで提案された解決策 他の質問 単純にget_attrをTagクラスに追加します。 glyいですが、動作します。

3
eric

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

  • 当社では、8以上のパイリントスコアが必要です。これにより、パイリントが理解できないコーディングプラクティスが可能になりますが、コードが「異常」ではないことが保証されます。これまでのところ、E1101が8以上のスコアに到達するのを妨げた例はありませんでした。
  • 私たちの「make check」ターゲットは、「for has no 'objects' member」メッセージを除外して、Djangoを理解していないpylintによって引き起こされる気晴らしのほとんどを取り除きます。
1
max
  1. Ctrl +を押してVSCの設定に移動します
  2. Ctrl + Shift + pを押して、「Python:Select Linter」と入力します
  3. ドロップダウンからmypyを選択します
  4. プロンプトが表示されたらmypyをインストールします。
0
Midhun Mohan

neovim & vim8には、w0rp's aleプラグインを使用します。 w0rp's alepylintおよびpylint-Djangoを含むすべてを正しくインストールした場合。 vimrcに次の行を追加し、Djangoを使用してWebアプリの開発を楽しんでください。ありがとう。

let g:ale_python_pylint_options = '--load-plugins pylint_Django'
0
Ganesh