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使用scrapy采集数据过程中放回下载过大页面的方法
Apr 08 Python
详解Python实现按任意键继续/退出的功能
Aug 19 Python
详解python中executemany和序列的使用方法
Aug 12 Python
Python File(文件) 方法整理
Feb 18 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
Python Gitlab Api 使用方法
Aug 28 Python
np.random.seed() 的使用详解
Jan 14 Python
浅谈python输出列表元素的所有排列形式
Feb 26 Python
什么是python的列表推导式
May 26 Python
基于Python制作一副扑克牌过程详解
Oct 19 Python
使用python将微信image下.dat文件解密为.png的方法
Nov 30 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 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魔术引号所带来的安全问题分析
2014/07/15 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
jQuery1.6 使用方法二
2011/11/23 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
深入理解Python异常处理的哲学
2019/02/01 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
2019/02/08 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
农行实习自我鉴定
2013/09/22 职场文书
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
办公室前台岗位职责范本
2013/12/10 职场文书
给老师的检讨书
2014/02/11 职场文书
行政专员的岗位职责
2014/03/10 职场文书
竞聘演讲稿
2014/04/24 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
群众路线调研报告范文
2014/11/03 职场文书
高考诚信考试承诺书
2015/04/29 职场文书
zabbix agent2 监控oracle数据库的方法
2021/05/13 Oracle