2016-03-14 6 views
14

の動的関数setattrを使用してオブジェクトに属性を追加する関数を想像してください。Pylint警告を避けるE1101:動的属性を持つクラスに対して 'インスタンスには.. ..メンバーがありません'

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

技術的にはこれがのないメンバーではなく、もちろんPylintは当然「デバイス1」について文句を言いに動作します。そうする理由は、私は、オブジェクトにいくつかの外部構造(例えば与えられたパラメータツリー)をマップしたいということですSomeClass

私は警告を無効にすることができますが、これは悪いことです(スペルミスなどの理由で属性が存在しない場合でも警告が表示されるためです)。

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

代わりに、行/ブロック/ファイルではなく、オブジェクトの1つだけPylintを無効にすることはできますか?

説明:私は、後にハードコード化された方法でこれらの属性にアクセスすることを計画したときに、私はメンバーを持つオブジェクトを装備する必要がありますなぜあなたは不思議に思うかもしれません

は動的属性。

理由がある:私は(装飾が起こる)のプログラムやが特定シナリオためを特化さ静的部分の動的部分を有します。だから私はもこのシナリオのための静的クラスを作成することができますが、それは多くの状況で過労です。

の専門コードは、いくつかのバスに接続されるかもしれないデバイスのいくつかのパラメータにアクセスできる可能性がある:だから'some/attached/device'の背後にある構造は任意と非常に複雑であるかもしれないと私にはない

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 

をそれをクラス構造で再現したい。 - 私はPylintを静めるためにこれを行うだろう

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

しかし、これは読み書くことが困難と素敵ではありません。この警告を取り除くために

一つの方法は、/ dictベースのツリーへのアクセスを作成することです。

あなたはサブクラス使用することができ
+0

私の質問は、あなたがアクセスしたい構造を前もって知っているなら、その構造を明示的に最初の場所? – nthall

+1

それはまさに問題です。私はそれを知らない。実際には、デバイスプロパティツリー(何でもよい)から構造体を読み込み、Pythonオブジェクトを構築します。私は、あなたが '生成-members'または'無視-classes' [pylintのオプション](https://docs.pylint.org/features.html#を設定することができます – frans

+3

...問題のビット、さらにこの上で詳しく説明しますコマンドライン上、または[です。TypeCheck] '下ID28)(' '.pylintrc') –

答えて

13

からThe Compilerは、あなたのプロジェクトで問題のクラスにルールを追加することができます示唆されているように:

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 

注意を.pylintrc

[TYPECHECK] 
ignored-classes=Fysom,MyClass 
0

:ちょうど今、私の作品の答えを提供するためのpython3

+0

これは単に(あまりにも、動的に生成されなければならなかった) 'WhateverDevice1Is'にMyClass''から問題を移動します。私はそれがありませんが、私の質問にいくつかの説明を追加しました。.. – frans

+0

しかし、あなたのデバイスクラス定義は、インポート時に知られていますか?あなたは何種類のデバイスを持っていますか?どのような私には奇妙なことは、あなたが名前とあなたのコードを記述する属性の数を知っている意味(SETATTRなし())の属性を使用したいということです。あなたはクリーンなコードが必要な場合は、この控除から、あなたはnamedtuple結局Adapater /プロキシの構造的なパターンでサブクラスを使用するか、または。 – Maresh

関連する問題