dynamicallyがsetattr
を使用してオブジェクトに属性を追加する関数を想像してください。これを行う理由は、外部構造(特定のパラメーターツリーなど)をオブジェクトにマッピングすることです。
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を静めるためだけに行います。
The Compiler が提案するように、今私のために働く答えを提供するために、プロジェクト.pylintrc
の問題のあるクラスにルールを追加することができます:
[TYPECHECK]
ignored-classes=Fysom,MyClass
このページ はエラーを説明し、コードで直接対処する簡単な方法を提供します。 tl; dr
存在しないメンバーに対してオブジェクト(変数、関数など)がアクセスされるときに使用されます。
偽陽性:このメッセージは、動的に作成されたが、アクセスされた時点で存在するオブジェクトメンバーを報告する場合があります。
コメンターは、# pylint: disable=no-member
を使用して、ファイルの先頭の1行で無効にできることを述べています。また、 このredditエントリ に基づいて# pylint: disable=E1101
を使用できることもわかりました。
これを試して!私の問題は解決しました!
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"
],
}
サブクラスを使用できます:
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