Python借助with语句实现代码段只执行有限次


Posted in Python onMarch 23, 2022

debug的时候,有时希望打印某些东西,但是如果代码段刚好在一个循环或者是其他会被执行很多次的部分,那么用来print的语句也会被执行很多次,看起来就不美观。

例如:

a = 0
for i in range(3):
    a += 1
print(a)

这里在中间希望确认一下a的类型,debug的时候改成:

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语句中使用的类(实现了__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共用了计数器,因此总共只会执行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不共用计数器)

1 <class 'int'>
1 <class 'int'>
1 <class 'int'>
2 <class 'int'>
2 <class 'int'>
2 <class 'int'>
6

到此这篇关于Python借助with语句实现代码段只执行有限次的文章就介绍到这了,更多相关Python代码段执行有限次内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解Python中的多线程编程
Apr 09 Python
Python中用Decorator来简化元编程的教程
Apr 13 Python
使用Python脚本生成随机IP的简单方法
Jul 30 Python
Django实现组合搜索的方法示例
Jan 23 Python
Centos 升级到python3后pip 无法使用的解决方法
Jun 12 Python
python 以16进制打印输出的方法
Jul 09 Python
在PyCharm下使用 ipython 交互式编程的方法
Jan 17 Python
python简单实现AES加密和解密
Mar 28 Python
使用python的turtle函数绘制一个滑稽表情
Feb 28 Python
python操作yaml说明
Apr 08 Python
Python+OpenCV图像处理——实现直线检测
Oct 23 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
Dec 27 Python
python3 字符串str和bytes相互转换
Mar 23 #Python
对象析构函数__del__在Python中何时使用
详解Python内置模块Collections
Mar 22 #Python
Python中 range | np.arange | np.linspace三者的区别
Python中非常使用的6种基本变量的操作与技巧
python使用torch随机初始化参数
Mar 22 #Python
Django基础CBV装饰器和中间件
You might like
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
yii框架配置默认controller和action示例
2014/04/30 PHP
php无序树实现方法
2015/07/28 PHP
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
Python各种扩展名区别点整理
2020/02/27 Python
python字典通过值反查键的实现(简洁写法)
2020/09/30 Python
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
C语言基础笔试题
2013/04/27 面试题
军训自我鉴定200字
2014/02/13 职场文书
小学教师自我评价
2015/03/04 职场文书
教师工作证明范本
2015/06/12 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang