5

我正在尝试处理我当前的 python 程序,非常注意 pylint 警告,所以虽然我意识到我可以简单地关闭警告,但我想确保在我这样做之前没有更理想的解决方案。

我当前的代码部分是我的日志记录代码。我有一个init()设置处理程序并将它们附加到根记录器的函数,以及一个set_console_level(level)设置控制台消息报告级别的函数(DEBUG、INFO 等):

_CONSOLE_OUT = NONE

def init():
    """Set up the error handlers for the root logger"""
    console_out = logging.StreamHandler()
    console_out.setLevel(logging.INFO)  #Show info messages for now
    #...
    logging.root.addHandler(console_out)
    global _CONSOLE_OUT
    _CONSOLE_OUT = console_out

    #Rest of function sets up more handlers similarly
init()

def set_console_level(level):
    """Change the level at which console messages are printed"""
    assert __CONSOLE_OUT is not None #Set in init
    _CONSOLE_OUT.setLevel(level) 

据我从阅读中可以看出,这是做到这一点的方法。需要该行global _CONSOLE_OUT才能写入模块级变量。但是,当我在这个文件上运行 pylint 时,我收到了警告W: 15,4:init: Using the global statement。有没有办法避免这个警告?解决这个问题的更好方法?

(请不要在没有global _CONSOLE_OUT #pylint: disable=W****理由的情况下说)

4

3 回答 3

2

您可以在导入时创建它:

_console_out = ConsoleHandler()

创建和设置处理程序ConsoleHandler的工厂函数或您的类在哪里。

于 2012-08-28T04:56:49.923 回答
1

这是一种在方法范围之外设置项目的奇怪模式。以后会导致问题,因为你不知道全局变量是从哪里设置的。

您的代码还依赖于方法的执行顺序来设置变量 - 大概 - 代码的其他部分所依赖的。如果您忘记在导入东西时特别调用 an ,这可能会在以后引起问题init()(当然您可以始终将其粘贴在 中__init__.py,但这不是这里的重点)。

鉴于这些,我认为另一种方法是创建一个类并在类中设置变量(给它另一个命名空间);或者如果你想保持原样,就像塞巴斯蒂安建议的那样返回配置变量。

如果您需要设置多个变量,您可以返回一个元组,然后将其解包以创建全局变量。

>>> def foo():
...   return "hello","world"
...
>>> a,b = foo()
于 2012-08-28T05:13:52.790 回答
0

init()我想到查看代码(以及 Burhan Khalid 的回答)的一件事是,我的代码根本没有理由必须在函数中,因为我只是想让它在导入时运行一次。我相信我最初这样做的唯一原因是处理程序变量不会是模块级的。

因此,我的代码可能只是

_CONSOLE_OUT = logging.StreamHandler()
_CONSOLE_OUT.setLevel(logging.INFO)  #Show info messages for now
#...
logging.root.addHandler(_CONSOLE_OUT)

#...

def set_console_level(level):
    """Change the level at which console messages are printed"""
    assert _CONSOLE_OUT is not None #Set at root
    _CONSOLE_OUT.setLevel(level)
于 2012-08-28T05:31:25.963 回答