2014-01-07 3 views
0

나는이 나는 보통 설정으로 확장 로거 무엇을 모방 한 다음 테스트 스크립트 :인스턴스에는 '추적'멤버가 없습니다 (그러나 어떤 종류의 추론 할 수없는)

import logging 

TRACE_LL  = 25 
TRACE_LSTR = 'TRACE' 
LOG_FORMATTER = '%(asctime)s - %(levelname)-10s - %(message)s' 

class MyLogger(logging.Logger): 

    def __init__(self, log_name): 
     logging.Logger.__init__(self, log_name) 
     self.setLevel(TRACE_LL) 
     hdlr = logging.StreamHandler() 
     formatter = logging.Formatter(LOG_FORMATTER) 
     hdlr.setFormatter(formatter) 
     self.addHandler(hdlr) 

    def trace(self, txt, *args, **kwargs): 
     self.log(TRACE_LL, txt, *args, **kwargs) 

def getlog(name): 
    return logging.getLogger(name) 

def setup(): 
    logging.setLoggerClass(MyLogger) 
    logging.addLevelName(TRACE_LL, TRACE_LSTR) 
setup() 

log = getlog('mylog') 
log.trace('Trace this') 

실행을 이 예상대로 작동합니다

2014-01-07 07:22:59,982 - TRACE  - Trace this 

하지만이에 pylint을 실행하는 원인을 문제 :

» pylint -E getlog_test.py 
No config file found, using default configuration 
************* Module getlog_test 
E: 29,0: Instance of 'RootLogger' has no 'trace' member (but some types could not be inferred) 

로깅을 광범위하게 사용하기 때문에 코드베이스에 수백 개의 메시지가 표시됩니다.

어떻게 필 링트 오류를 ​​해결할 수 있습니까?

다른 방법으로는 사용하지 않도록 설정하는 것만으로도 충분하지만, RootLogger 인스턴스의 경우에만 가능합니다. 코드의 다른 부분에이 문제가 있는지 계속 알고 싶습니다.

답변

1

필립트는 가치가 있지만, 제 경험상 많은 잘못된 경고와 오류가 발생합니다. 당신은 양식의 의견이 코드를 둘러싼하여 코드의 라인 하나 이상의 검사를 비활성화 할 수 있습니다

E1103이 억제 될 수있는 오류는
# pylint: disable=E1103 
code that pylint trips over 
# pylint: enable=E1103 

. 쉼표로 구분 된 오류 코드 목록을 사용하여 동일한 방법으로 여러 오류를 억제 할 수 있습니다. 이것에 관한 Pylint의 문서는 here입니다.

+1

감사합니다. 나는 이것을 테스트하고 있습니다. 내 문제에 대한 오류 코드는'E1103' ('pylint --list-msgs | grep "그러나 어떤 유형은"')이 유추 될 수 없습니다. – dangonfast

+0

@gonvaled. 오류 번호를 업데이트하고이 기능에 대한 pylint의 설명서 링크를 추가했습니다. – John1024

+0

나는 이것을 테스트했다. '--disable E1103' 명령 줄에서 비활성화 할 수는 있지만 영향을받은 모듈 (내 로거 모듈)을 선택적으로 비활성화 할 수는 없습니다. 로거를 사용하여 모든 파일에'#pylint : disable = E1103'이 가능하지 않으며'RootLogger'와 관련이없는 다른 오류도 숨길 것입니다. 그래서 현재 명령 줄'--disable' 플래그를 사용하여 에러 메시지가 전역 적으로 비활성화됩니다.'RootLogger' **와 ** 다른 영향을받는 클래스는 피해야합니다. 그러나 나는 당분간 이걸로 살아야 할 것 같아. – dangonfast

1

이것은 Pylint가 MyLogger 인스턴스를 getLogger에 가져올 것임을 이해할만큼 똑똑하지 않기 때문입니다.

메시지의 인 에이블 활성화/비활성화를 사용하는 것 외에는 처음에는 더 쉽지만 필림트 - 브레인 프로젝트 (https://bitbucket.org/logilab/pylint-brain)를 살펴볼 수도 있습니다.

기본 로깅 로거에 '추적'방법을 추가 할 수있는 작은 astroid 플러그인을 작성하는 방법을 찾을 수 있습니다 (또는 더 좋게는 인스턴스를 반환하지만 조금 까다 롭습니다).

이것은 장기적으로 볼 때 분명히 좋습니다.