クラス変数を介して型検査を実装するクラスがあります。 次に、クラスがインスタンス化されるとき、定義された変数は、必須の型を持つクラスの必須の引数になります。パターンは次のようになります。pylintプラグインの引数に基づいて複数の推定型を設定する
class MyClass(MagicBaseClass):
arg1 = ArgumentObj(allowedTypes=(basestring,))
arg2 = ArgumentObj(allowedTypes=(list, tuple))
def myMethod(self):
print type(self.arg1) # a basestring
print type(self.arg2) # a list
mc = MyClass(arg1='test', arg2=())
mc.myMethod()
Pylintはこれが好きではありません。 arg1
とarg2
は、ArgumentObj
のインスタンスとみなされます。だから私は、渡された型を読み取って、それらの型のインスタンスとして私のMagicBaseClass
内のオブジェクトを扱うプラグインを書きたいと思います。
私は、クラス変換の正しいノードを掘り下げる方法を見つけ出すことができました。私は必要なすべてのデータにアクセスできますが、実際にそれをどうすればいいのか分かりません。キッカーは、複数の許可されたタイプです。私はそれを処理するためのサンプルを見つけることができず、私が見つけることができるドキュメントは基本的に役に立たない。
from astroid import MANAGER
from astroid import nodes, node_classes
def transform_myClass(node):
for key, value in node.locals.items():
val = value[0]
try:
s = val.statement().value
if s.func.name != 'ArgumentObj':
continue
except AttributeError:
continue
for child in s.get_children():
if not isinstance(child, node_classes.Keyword):
continue
if child.arg == 'allowedTypes':
typeNames = child.value
#### And here is where I have no idea what to do next ####
MANAGER.register_transform(nodes.ClassDef, transform_myClass)