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