Python上下文管理和冗长性
为了便于在编写代码时进行测试,我在编写的几乎每个模块中都包含详细信息,如下所示:Python上下文管理和冗长性,python,logging,Python,Logging,为了便于在编写代码时进行测试,我在编写的几乎每个模块中都包含详细信息,如下所示: class MyObj(object): def __init__(arg0, kwarg0="default", verbosity=0): self.a0 = arg0 self.k0 = kwarg0 self.vb = verbosity def my_method(self): if verbosity > 2:
class MyObj(object):
def __init__(arg0, kwarg0="default", verbosity=0):
self.a0 = arg0
self.k0 = kwarg0
self.vb = verbosity
def my_method(self):
if verbosity > 2:
print(f"{self} is doing a thing now...")
或
导入这些内容的可执行脚本将(从命令行或其他地方)收集一个详细参数,该参数将一直向下传递到堆栈
我想到了使用一个上下文管理器,这样我就不必在堆栈的每个级别初始化这个变量,就像在驱动程序脚本中有这样的内容:
with args.verbosity as vb:
my_func("x", "y")
我可以这样做,然后在我的函数中使用vb,而不必将其包含在签名中吗?有没有更好的方法来实现这种控制
后续编辑:从第一个答案就可以清楚了——谢谢那些——我需要检查日志记录模块,但在某些情况下,我想停止在中间执行检查特定堆栈级别的东西(见<代码> IPDB <代码>代码,我用这个编辑添加)。您仍然建议我使用日志记录吗?(我假设如果我觉得有必要偶尔在我的代码中添加像这样的if语句,那么有一种方法可以获得日志记录级别。)
最后,我仍然对上下文管理解决方案是否会起作用感兴趣(即使它不是最佳解决方案) 为了便于在编写代码时进行测试,我在编写的几乎每个模块中都包含了详细的内容 不要在代码中乱放if语句和用于这种目的的打印。它使代码凌乱、重复,可读性较差 该用例正是stdlib的用途:您可以无条件地以各种详细级别记录描述程序正在执行的操作的事件,并且根据日志系统的配置,将显示或不显示消息import logging
log = logging.getLogger(__name__)
def my_func(arg0, arg1):
log.info("doing something to %s and %s...", arg0, arg1)
do_something()
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG, format="%(message)s")
my_func(123, 456)
在上面的示例中,消息将被打印,因为它处于INFO级别,该级别高于我配置的详细级别(调试)。如果在警告级别配置日志记录,则不会显示
通常,用户将通过配置文件、环境变量或命令行参数控制日志配置设置(级别、格式、流、文件)。最终用户可以选择满足其需要的特定日志记录配置,因为开发人员可以随时记录事件。无需担心日志事件最终会发生在哪里,或者它们是否会发生在任何地方。另一种方法是日志记录级别。例如,Python的内置
日志记录
模块具有错误
、警告
、信息
和调试
级别:
导入日志
logger=logging.getLogger()
logger.info('正常消息')
debug('仅以高详细度打印的消息`)
只需将日志级别配置为调试、警告等,就基本完成了!此外,您还可以获得许多本地日志记录产品。Helpufl,谢谢,我将探索。我假设有一种简单的方法(比如
-v5
可以从命令行控制日志记录级别)?@HaPsantran您通常会通过启用日志记录配置调用来实现这一点。谢谢;在这个例子中,什么设置了冗长?
import logging
log = logging.getLogger(__name__)
def my_func(arg0, arg1):
log.info("doing something to %s and %s...", arg0, arg1)
do_something()
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG, format="%(message)s")
my_func(123, 456)