私は 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コードで発生しました。ロード/呼び出しであったソースではありません。)
ignores
またはgenerated-members
を追加してPylint機能を無効にしたり弱めたりしないでください。
Djangoを理解する積極的に開発されたPylintプラグインを使用します。
Django用のこのPylintプラグイン は非常にうまく機能します。
pip install pylint-Django
そして、pylintを実行するときに、コマンドに次のフラグを追加します。
--load-plugins pylint_Django
詳細なブログ投稿 こちら 。
私は次を使用します:pylint --generated-members=objects
私の〜/ .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行目)。
幸せな日々!
Visual Studio Codeを使用する場合は、次を実行します。
pip install pylint-Django
そして、VSC configに追加します。
"python.linting.pylintArgs": [
"--load-plugins=pylint_Django"
],
Django-lintは、Django特定の設定: http://chris-lamb.co.uk/projects/Django-lint/ でパイリントをラップする素敵なツールです。
githubプロジェクト: https://github.com/lamby/Django-lint
Pylintの動作方法(Pythonを実際に実行せずにソース自体を検査します)のため、pylintがメタクラスと複雑なベースクラスが実際にクラスとそのインスタンスにどのように影響するかを把握するのは非常に困難です。 「pychecker」ツールは、この点で少し優れていますdoes実際にPythonコードを実行します。モジュールをインポートし、結果のオブジェクトを検査します。実際にはPythonコードを実行させます:-)
パイリントを拡張して、マジックDjangoの使用方法を教えたり、メタクラスや複雑なベースクラスをよりよく理解したり、1つ以上の機能を検出した後にそのようなケースを無視したりできますソースの特別なコメント、コマンドラインオプション、または.pylintrcファイルを使用して、これらのことについて警告しないようにpylintに指示することもできます。
Djangoコードでpyflakesを使用することを支持して、pylint/pycheckerの使用を辞任しました。モジュールをインポートしようとし、未使用のインポートや初期化されていないローカル名などの問題を報告します。
これは解決策ではありませんが、動作を変更せずにDjango=モデルにobjects = models.Manager()
を追加できます。
私自身はパイフレークのみを使用します。これは主に、一部のパイリントの鈍いデフォルトと怠慢のためです(デフォルトの変更方法を調べたくない)。
でpylintを実行してみてください
pylint --ignored-classes=Tags
それが機能する場合、他のすべてのDjangoクラス-おそらくスクリプトを使用して、たとえばpython:P
--ignore-classes
のドキュメントは次のとおりです。
--ignored-classes=<members names>
メンバー属性をチェックしないクラス名のリスト(属性が動的に設定されているクラスに有用)。 [現在:%default]
私の意見では、これは特にエレガントなソリューションではありませんが、機能するはずです。
これで提案された解決策 他の質問 単純にget_attrをTagクラスに追加します。 glyいですが、動作します。
これまでのところ、私はそれに対する本当の解決策を見つけていませんが、回避策があります:
neovim & vim8
には、w0rp's ale
プラグインを使用します。 w0rp's ale
、pylint
およびpylint-Django
を含むすべてを正しくインストールした場合。 vimrc
に次の行を追加し、Djangoを使用してWebアプリの開発を楽しんでください。ありがとう。
let g:ale_python_pylint_options = '--load-plugins pylint_Django'