를 통해 변수를 인식 pylint 만들기 위해, 내 시나리오는 다음과 단순화 할 수 a.py방법 별 모양
from plugins import plu
class FooClass(object):
def bar(self):
self.plu.foo("asdasd")
if __name__ == '__main__':
a = FooClass()
for plugin_name, plugin in plu.plugins.items():
setattr(a, plugin_name, plugin())
a.bar()
플러그인 폴더 파일 plu.py :
plugins = {}
class Plugin(object):
def foo(self, arg):
print("bar %s" % arg)
plugins['plu'] = Plugin
아이디어 플러그인 자신과 FooClass
개체에 대한 다른 방법 "을 소개합니다"를 등록하는 것이. a.py의
출력은 다음과 같습니다
bar asdasd
(예상대로)
pylint -E a.py
를 실행하면 다음과 같은 오류 산출 :
pylint -E a.py
************* Module a
E: 5, 8: Instance of 'FooClass' has no 'plu' member (no-member)
나는 다음과 같은 pylint-를 작성 시도했다가 플러그인 :
import astroid
from astroid import nodes
def transform_test_class(mod):
if mod.name != 'a':
return
foo_cls = mod.lookup('FooClass')[1]
plugin_cls_def = astroid.MANAGER.ast_from_module_name('plugins.plu')
foo_cls[0].locals['plu'] = plugin_cls_def.lookup('Plugin')[1]
def register(linter):
astroid.MANAGER.register_transform(nodes.Module, transform_test_class)
을 실행
출력은 다음과 같습니다 오류에서
************* Module a
E: 5, 8: No value for argument 'arg' in unbound method call (no-value-for-parameter)
나는 pylint이 방법 foo
은 억제 할 수없는 것을 생각으로 어떻게 든 내가 잘못 속성을 소개하는 것으로 생각하지만, 실제로 묶여있다. 나는 foo_cls[0].locals['plu']
이 실제로 클래스 Plugin
의 인스턴스이고 클래스 자체가 아니라는 것을 pylint에 알리는 방법을 찾아야합니다. 이것이 어떻게 달성 될 수 있는지 생각해보십시오.