の動的関数が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
ベースのツリーへのアクセスを作成することです。
私の質問は、あなたがアクセスしたい構造を前もって知っているなら、その構造を明示的に最初の場所? – nthall
それはまさに問題です。私はそれを知らない。実際には、デバイスプロパティツリー(何でもよい)から構造体を読み込み、Pythonオブジェクトを構築します。私は、あなたが '生成-members'または'無視-classes' [pylintのオプション](https://docs.pylint.org/features.html#を設定することができます – frans
...問題のビット、さらにこの上で詳しく説明しますコマンドライン上、または[です。TypeCheck] '下ID28)(' '.pylintrc') –