2016-07-10 1 views
1
내가 멤버 함수를 인식 pylint "을 가르 칠"하기 위해 노력하고있어

를 통해 변수를 인식 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에 알리는 방법을 찾아야합니다. 이것이 어떻게 달성 될 수 있는지 생각해보십시오.

답변

2

플러그인 클래스를 FooClass의 로컬에 추가 할 때 플러그인 클래스를 인스턴스화해야합니다. 따라서이 줄을 foo_cls[0].locals['plu'] = plugin_cls_def.lookup('Plugin')[1]으로 바꾸고 foo_cls[0].locals['plu'] = [cls.instantiate_class() for cls in plugin_cls_def.lookup('Plugin')[1]]

관련 문제