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

Python '的实例;RootLogger';没有';跟踪';成员(但无法推断某些类型),python,pylint,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__(

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

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
实例:我仍然想知道代码的其他部分是否存在此问题。

尽管我发现pylint很有价值,但根据我的经验,它会产生许多错误警告。通过在代码周围添加以下注释,可以禁用对代码任何行的一个或多个检查:

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

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

这是因为Pylint不够聪明,无法理解调用
getLogger
时会得到
MyLogger
实例

除了使用内联启用/禁用消息(一开始比较容易)之外,您可能还想看看pylint brain项目()

您将在那里找到如何编写一个小的astroid插件,它可以为默认日志记录器添加一个“跟踪”方法(或者更好,通知
logging.getLogger()
return
MyLogger
实例,但这有点棘手)


从长远来看,这肯定更好

谢谢,我正在测试这个。我的问题的错误代码是
E1103
pylint--list-msgs | grep“但无法推断某些类型”
)@gonvaled谢谢。我更新了错误号并添加了一个链接到pylint关于此功能的文档。我已经测试过了。我可以在命令行上使用
--disable E1103
禁用它,但不可能对受影响的模块(我的记录器模块)选择性禁用它。我需要使用我的记录器使用
#pylint:disable=E1103
检测所有文件,这是不可行的,并且还将屏蔽与
根记录器
无关的其他错误。因此,目前,使用命令行
--disable
标志,错误消息被全局禁用,用于
RootLogger
和其他受影响的类,这是我想要避免的。但我想我暂时得接受这个。