是否可以在Python中返回实际代码?

时间:2018-05-06 14:58:08

标签: python python-3.x

我正在创建一个需要初始化记录器的类。

我希望能够选择记录器的“记录级别”(信息,警告,错误)。

我想过使用这样的参数:

class classA:

    def __init__(self, logLevel = 'info'):

        #stuff
        #initialize logger
        self.logger.setLevel(logLevel)

但我很确定这不起作用。

所以我想用logLevel替换getLogLevel(logLevel)getLogLevel看起来像这样:

def getLogLevel(logLevel):
    if logLevel == 'info':
        return 'logging.INFO'
    elif .......

但是这里出现了一个问题。我很确定我不能像这样返回'代码'。

有没有办法让这个更干净而不会使__init__方法混乱? (顺便说一句,我知道你可以使用一种方法来处理带有基于logLevel的if语句的记录器,但是我想知道是否有多种方法可以做到这一点。)

3 个答案:

答案 0 :(得分:3)

您正在使用字符串,其中日志记录枚举更合适。

例如

class classA:

    def __init__(self, logLevel = logging.INFO):

        #stuff
        #initialize logger
        self.logger.setLevel(logLevel)

或者如果你想把它保存为一个字符串(你没有)并使用getLogLevel()更改如下:

def getLogLevel(logLevel):
    if logLevel == 'info':
        return logging.INFO
    elif .......

答案 1 :(得分:2)

从Python 3.2+开始,stdlib logging模块的记录器接受日志级别的字符串表示。他们只需要大写。

class A:
    def __init__(self, log_level='info'):
        ...
        self.logger.setLevel(log_level.upper())

这些记录器将它们的级别存储为整数,但您可以轻松地返回字符串表示。

logging.getLevelName(logger.level)

答案 2 :(得分:1)

使用getattr,您可以从logging模块中获取对象。试试这个:

class classA:

def __init__(self, logLevel = 'info'):

    #initialize logger
    self.logger.setLevel(getattr(self.logger, logLevel.upper()))

每个日志级别都有一个数值:

>>> import logging
>>> logging.INFO
20
>>> logging.ERROR
40

使用getattr您可以传递字符串和对象以获取属性的值:

>>> getattr(logging, 'INFO')
20
>>> getattr(logging, 'ERROR')
40

请注意,字符串必须为大写。

这段代码看起来有点复杂,因为我们已经链接了函数调用。 有些人可能会发现此代码更清晰:

class classA:

    def __init__(self, logLevel = 'info'):

        #initialize logger
        self.set_loglvl(logLevel)

    def set_loglvl(self, lvl):
        l = getattr(self.logger, lvl)
        self.logger.setLevel(self.loglvl(logLevel))