150

Python プロジェクトのビルド プロセスにpylintを統合したいのですが、1 つの show-stopper に遭遇E1101: *%s %r has no %r member*しました。 、 例えば:

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 の場合、クラッシュは pychecker コードで発生しました。読み込み中または呼び出し中のソースではありません。)pycheckerpyflakes

4

12 に答える 12

169

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

pip install pylint-django

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

--load-plugins pylint_django

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

于 2015-06-23T10:47:45.510 に答える
64

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

于 2009-09-12T22:21:47.310 に答える
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 行目)。

幸せな日々!

于 2010-11-12T08:59:11.543 に答える
19

django-lint は、django 固有の設定で pylint をラップする優れたツールです: http://chris-lamb.co.uk/projects/django-lint/

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

于 2010-03-16T17:00:16.963 に答える
16

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

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

于 2008-09-22T16:46:00.760 に答える
7

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

于 2008-09-22T20:12:40.373 に答える
7

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

私自身はpyflakesのみを使用しています。これは主に、pylintのいくつかの愚かなデフォルトと私の側の怠惰のためです(デフォルトを変更する方法を調べたくない)。

于 2008-09-23T00:17:58.663 に答える
5

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

pylint --ignored-classes=Tags

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

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

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

これは私の見解では特にエレガントなソリューションではありませんが、うまくいくはずです。

于 2008-09-22T16:50:09.160 に答える
3

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

于 2011-02-24T12:48:37.580 に答える
1

これまでのところ、それに対する実際の解決策は見つかりませんでしたが、回避策は次のとおりです。

  • 当社では、8 を超える pylint スコアが必要です。これにより、コードがあまりにも「異常」にならないようにしながら、pylint が理解できないコーディング プラクティスが可能になります。これまでのところ、E1101 が原因で 8 以上のスコアに到達できなかった例は確認されていません。
  • 私たちの「make check」ターゲットは、「for has no 'objects' member」メッセージを除外して、pylint が Django を理解していないことによって引き起こされる混乱のほとんどを取り除きます。
于 2009-01-04T11:37:48.100 に答える