Python利用with语句限制Debug打印执行次数

咖啡半糖
咖啡半糖
发布时间:2026-10-15| 4人浏览过
原创

在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代码段执行有限次的内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。