我正在构建一个处理物理模拟的小型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?
答案 0 :(得分:1)
您可以使用Python的logging module,然后使用logging.debug()
记录所需的内容。在运行时,只需将日志记录级别指定为显示或隐藏日志所需的级别即可。
否则,您可以使用__debug__
全局变量。这两个选项在this SO question中有更详细的说明。