如果指定了标志,则在运行时完全删除特定的代码执行

时间:2019-11-26 08:01:11

标签: python logging

我正在构建一个处理物理模拟的小型Python库,我想在其中添加某种形式的日志记录以跟踪正在发生的事情。但是,我希望能够防止不必要的代码被调用-例如,Python中的assert语句可能会或可能不会在运行时运行。我也知道函数注解,但是据我了解,这些包装函数,不能在函数内部使用。这一点特别重要,因为我的某些跟踪可能会在for循环中发生,这可能会运行数百次,并且添加if语句似乎不是一个奇妙的解决方案,并且添加虚拟类也不会像下面的示例一样。

def debug():
    return True


class Logger():
    def log(class_name, function_name, description):
        pass


class ConsoleLogger(Logger):
    def log(class_name, function_name, description):
        print(class_name, function_name, description)
        return true


def factorialLogger(logger):
    a = 1 
    for i in range(0, 10):
        a *= 1
        logger.log("", "factorial", f"a: {a}")
    return a


def factorialFlag(flag):
    logger = ConsoleLogger()
    a = 1 
    for i in range(0, 10):
        a *= 1
        if flag:
            logger.log("", "factorial", f"a: {a}")
    return a


def factorialAssert(logger):
    a = 1 
    for i in range(0, 10):
        a *= 1
        assert logger.log("", "factorial", f"a: {a}")


if __name__ == "__main__":
    # Insert dummy class
    if debug():
         factorialLogger(ConsoleLogger())
    else:
         factorial(Logger())

    # Pass boolean flag
    factorialFlag(debug())

    # Use assert optimization:
    factorialAssert(ConsoleLogger())

这个问题是我会在for循环中反复调用Logger,这对于性能而言是不希望的-我想改成像编译C那样的行为-您可以使用#ifdef定义仅在编译时使用的宏带有特定标志。是否有更好的方法可以在Python中不使用断言的情况下获得这种行为,而断言会让人觉得很hack?

1 个答案:

答案 0 :(得分:1)

您可以使用Python的logging module,然后使用logging.debug()记录所需的内容。在运行时,只需将日志记录级别指定为显示或隐藏日志所需的级别即可。

否则,您可以使用__debug__全局变量。这两个选项在this SO question中有更详细的说明。