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对数据库操作
Mar 28 Python
python实现壁纸批量下载代码实例
Jan 25 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
python K近邻算法的kd树实现
Sep 06 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
关于Python-faker的函数效果一览
Nov 28 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
Mar 25 Python
Python是怎样处理json模块的
Jul 16 Python
python实现经典排序算法的示例代码
Feb 07 Python
CocosCreator ScrollView优化系列之分帧加载
Apr 14 Python
python四个坐标点对图片区域最小外接矩形进行裁剪
Jun 04 Python
Opencv实现二维直方图的计算及绘制
Jul 21 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
php取得字符串首字母的方法
2015/03/25 PHP
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
浅析javascript中函数声明和函数表达式的区别
2015/02/15 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
js 定义对象数组(结合)多维数组方法
2016/07/27 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
node文件上传功能简易实现代码
2017/06/16 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
PHP 502bad gateway原因及解决方案
2020/11/13 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
python3下使用cv2.imwrite存储带有中文路径图片的方法
2018/05/10 Python
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
解决Python内层for循环如何break出外层的循环的问题
2019/06/24 Python
美国内衣品牌:Leonisa
2016/08/14 全球购物
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
安全保证书范文
2014/04/29 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL