“RootLogger”的实例没有“跟踪”成员(但无法推断某些类型)

时间:2014-01-07 06:30:41

标签: python pylint

我有以下测试脚本,它模仿我通常用来设置扩展记录器的工作:

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)

我在代码库中收到了数百条消息,因为我正在广泛使用日志记录。

如何解决pylint错误?

作为替代方案,禁用它也足够了,但仅适用于RootLogger实例:我仍然想知道代码的其他部分是否存在此问题。

2 个答案:

答案 0 :(得分:1)

虽然我发现pylint很有价值,但根据我的经验,它会产生许多错误的警告和错误。您可以通过以下表单的注释包含该代码来禁用对代码的任何行的一个或多个检查:

# pylint: disable=E1103
code that pylint trips over
# pylint: enable=E1103

其中E1103是要抑制的错误。您可以使用逗号分隔的错误代码列表以相同的方式抑制多个错误。 Pylint的文档是here

答案 1 :(得分:1)

这是因为Pylint不够聪明,无法理解您在调用MyLogger时会收到getLogger个实例。

除了首先使用内联启用/禁用消息之外,您可能还需要查看pylint-brain项目(https://bitbucket.org/logilab/pylint-brain)。

你会发现如何编写一个小的astroid插件,可以为默认的日志记录记录器添加一个'trace'方法(甚至更好,通知logging.getLogger()返回MyLogger实例,但这是一个有点棘手)。

从长远来看,这肯定会更好。