1. ホーム
  2. python

[解決済み] 動的属性を持つクラスに対するPylint警告E1101: 'Instance of .. has no ... member'を回避する。

2022-02-19 18:51:16

質問

以下のような関数を想像してください。 動的に を使用してオブジェクトに属性を追加します。 setattr . このようにする理由は、ある外部構造(例えば、与えられたパラメータツリー)をオブジェクトにマッピングしたいからです。

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

技術的にはうまくいくのですが、当然ながらPylintは'device1'が SomeClass .

警告を無効にすることもできますが、それは良くありません(スペルミスなどで属性が存在しない場合、すべてのケースで警告が出るようにしたいからです)。

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

または のみPylintを無効にすることはできますか? オブジェクト 行/ブロック/ファイルではなく、?

説明 :

後でハードコーディングされた属性にアクセスする予定なのに、なぜオブジェクトに動的に属性を装備しなければならないのかと思うかもしれません。

その理由は、プログラムの動的な部分(ここで装飾が行われる)と、静的な部分(ここで装飾が行われる)があるからです。 専門的 ある特定の シナリオ . だから私は できる このシナリオのために静的クラスを作成することもできますが、多くの場合、それは過剰な作業となります。

以下は 専門的 のコードは、バスに接続されたデバイスのパラメータにアクセスできるようにするかもしれません。

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' は恣意的で非常に複雑かもしれないので、クラス構造で再現するのは避けたい。

この警告をなくす一つの方法として、このような場合、「Subject.php」を作成/アクセスし、「Subject.php」を削除する必要があります。 dict ベースのツリーです。

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

しかし、これでは書くのも大変だし、読むのも気持ち悪い。Pylintを黙らせるためにしか、こんなことはしない。

解決方法は?

このページ は、このエラーについて説明し、コードに直接対処する簡単な方法を示しています。

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

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

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