web-dev-qa-db-ja.com

パイリント警告E1101を回避する:動的属性を持つクラスの '..のインスタンスには..メンバーがありません'

dynamicallysetattrを使用してオブジェクトに属性を追加する関数を想像してください。これを行う理由は、外部構造(特定のパラメーターツリーなど)をオブジェクトにマッピングすることです。

my_object = SomeClass()
apply_structure(my_object, some_descriptor)
my_object.device1.enabled = True

技術的にはこれは機能しますが、もちろんPylintは 'device1'がSomeClassのメンバーではないことを正しく文句を言います。

警告を無効にすることはできますが、それは悪いことです(スペルミスなどのために属性が存在しないすべての場合に警告を引き続き取得したいため)。

警告につながらないオブジェクトに動的にメンバーを追加するための一般的かつ合法的な(Pylint-proof)方法はありますか?

あるいは、line/block/fileではなく、1つだけobjectでPylintを無効にできますか?

説明

後でハードコードされた方法でこれらの属性にアクセスする予定があるときに、オブジェクトにメンバー属性を動的に装備する必要があるのはなぜかと思うかもしれません。

その理由は、プログラムの動的な部分(装飾が行われる場所)と、特定のシナリオに対してspecializedである静的な部分があるからです。したがって、私はcouldもこのシナリオの静的クラスを作成しますが、多くの状況ではそれはやり過ぎです。

次のspecializedコードは、バスに接続されているデバイスのパラメーターへのアクセスを許可する場合があります。

class MyDeviceHandler:
   on_get_some_subtree_element(self):
      return _some_internal_value
   on_set_some_subtree_element(self, value):
      _some_internal_value = value

dev = MyDeviceHandler()

decorate_object_with_device_structure(dev, 'some/attached/device')

dev.some.subtree.element = 5       <--- will call the set-callback
x = dev.some.subtree.element       <--- will call the get-callback

したがって、'some/attached/device'の背後にある構造はthe意的で非常に複雑になる可能性があり、クラス構造でそれを再現したくありません。

この警告を取り除く1つの方法は、dictベースのツリーを作成/アクセスすることです。

dev['some']['subtree']['element'] = 5

しかし、これは書くのが難しく、読むのがナイスではありません。これは、Pylintを静めるためだけに行います。

43
frans

The Compiler が提案するように、今私のために働く答えを提供するために、プロジェクト.pylintrcの問題のあるクラスにルールを追加することができます:

[TYPECHECK]
ignored-classes=Fysom,MyClass
42
frans

このページ はエラーを説明し、コードで直接対処する簡単な方法を提供します。 tl; dr

存在しないメンバーに対してオブジェクト(変数、関数など)がアクセスされるときに使用されます。

偽陽性:このメッセージは、動的に作成されたが、アクセスされた時点で存在するオブジェクトメンバーを報告する場合があります。

コメンターは、# pylint: disable=no-memberを使用して、ファイルの先頭の1行で無効にできることを述べています。また、 このredditエントリ に基づいて# pylint: disable=E1101を使用できることもわかりました。

6
user2577

これを試して!私の問題は解決しました!

PylintはDjangoの動的ファイルを理解していません。したがって、PylintにDjangoが何であるかを教える必要があります

* Windows 10のvscodeの場合*

$ pip install pylint-Django
$ cd your_project_folder
$ code . // run vscode  

Python用拡張機能、Djangoスニペット、Djangoテンプレートをvscodeにインストールします

Vscodeで.vscode/settings.jsonを開き、以下を追加します。

{
   "python.linting.pylintEnabled": true,
   "python.linting.enabled": true,
   "python.pythonPath": "venv\\Scripts\\python.exe",
   "python.linting.pylintArgs": [
       "--load-plugins",
       "pylint_Django"
   ],
}
0
yongtaek jun

サブクラスを使用できます:

class MyClass(Someclass):
    def init(self):
       super().__init__()
       self.device1 = WhateverDevice1Is()

my_object = MyClass()
apply_structure(my_object, some_descriptor)
my_object.device1.enabled = True

注:Python3

0
Maresh