Python利用with语句限制Debug打印执行次数
在Python调试过程中,循环内的print语句可能频繁输出导致日志混乱。本文介绍通过自定义实现了__enter__和__exit__方法的类,结合with语句实现代码段有限次执行。通过tag区分不同打印任务,利用共享计数器控制输出频率,有效简化Debug信息展示。
Debug打印频率过高的问题
在调试代码时,开发者常需要打印某些变量以检查状态。然而,若该打印语句位于循环或高频执行的代码块中,print函数会被反复调用,导致控制台输出冗杂且难以阅读。
例如:
a = 0
for i in range(3):
a += 1
print(a)假设我们需要在循环中间确认变量a的数据类型,在调试阶段通常会修改代码为:
a = 0
for i in range(3):
print(type(a))
a += 1
print(a)
''' 打印结果:
<class 'int'>
<class 'int'>
<class 'int'>
3
'''此时控制台会输出3个 <class ‘int’>,视觉效果杂乱。
基于with语句的实现方案
为解决此问题,可以利用with语句配合自定义类来实现执行次数限制。首先需要定义一个支持with语法的类,该类需实现__enter__和__exit__方法:
from typing import Any
class LimitedRun(object):
run_dict = {}
def __init__(self,
tag: Any = 'default',
limit: int = 1):
self.tag = tag
self.limit = limit
def __enter__(self):
if self.tag in LimitedRun.run_dict.keys():
LimitedRun.run_dict[self.tag] += 1
else:
LimitedRun.run_dict[self.tag] = 1
return LimitedRun.run_dict[self.tag] <= self.limit
def __exit__(self, exc_type, exc_value, traceback):
return
tag是标签,相同标签共用执行次数计数器;limit是限制执行的次数。例子如下:
a = 0
for i in range(3):
with LimitedRun('print_1', 1) as limited_run:
if limited_run:
print(type(a))
a += 1
print(a)运行后的打印结果如下:
<class 'int'> 3
a = 0
for i in range(3):
with LimitedRun('print_1', 4) as limited_run:
if limited_run:
print(1, type(a))
a += 1
for i in range(3):
with LimitedRun('print_1', 4) as limited_run:
if limited_run:
print(2, type(a))
a += 1
print(a)相同Tag的计数器共享机制
若使用相同的tag,则所有调用共享同一个计数器,因此总共只会执行4次:
1 <class 'int'> 1 <class 'int'> 1 <class 'int'> 2 <class 'int'> 6
a = 0
for i in range(3):
with LimitedRun('print_1', 4) as limited_run:
if limited_run:
print(1, type(a))
a += 1
for i in range(3):
with LimitedRun('print_2', 4) as limited_run:
if limited_run:
print(2, type(a))
a += 1
print(a)不同Tag的独立计数逻辑
若使用不同的tag,则各tag拥有独立的计数器:
1 <class 'int'> 1 <class 'int'> 1 <class 'int'> 2 <class 'int'> 2 <class 'int'> 2 <class 'int'> 6
本文介绍了利用Python with语句限制代码段执行次数的方法,更多相关Python代码段执行有限次的内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













