Python借助with語(yǔ)句實(shí)現(xiàn)代碼段只執(zhí)行有限次
debug的時(shí)候,有時(shí)希望打印某些東西,但是如果代碼段剛好在一個(gè)循環(huán)或者是其他會(huì)被執(zhí)行很多次的部分,那么用來(lái)print的語(yǔ)句也會(huì)被執(zhí)行很多次,看起來(lái)就不美觀。
例如:
a = 0 for i in range(3): ? ? a += 1 print(a)
這里在中間希望確認(rèn)一下a的類型,debug的時(shí)候改成:
a = 0 for i in range(3): ? ? print(type(a)) ? ? a += 1 print(a) ''' 打印結(jié)果: <class 'int'> <class 'int'> <class 'int'> 3 '''
有3個(gè) <class ‘int’>,很不好看。
為了解決這個(gè)問(wèn)題,可以借助with
語(yǔ)句實(shí)現(xiàn),首先要定義一個(gè)能夠在with語(yǔ)句中使用的類(實(shí)現(xiàn)了__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是標(biāo)簽,相同標(biāo)簽共用執(zhí)行次數(shù)計(jì)數(shù)器;limit是限制執(zhí)行的次數(shù)。例子如下: 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)
打印結(jié)果:
<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)
打印結(jié)果:(相同tag共用了計(jì)數(shù)器,因此總共只會(huì)執(zhí)行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)
打印結(jié)果:(不同tag不共用計(jì)數(shù)器)
1 <class 'int'>
1 <class 'int'>
1 <class 'int'>
2 <class 'int'>
2 <class 'int'>
2 <class 'int'>
6
到此這篇關(guān)于Python借助with語(yǔ)句實(shí)現(xiàn)代碼段只執(zhí)行有限次的文章就介紹到這了,更多相關(guān)Python代碼段執(zhí)行有限次內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Scrapy項(xiàng)目實(shí)戰(zhàn)之爬取某社區(qū)用戶詳情
這篇文章主要介紹了Scrapy項(xiàng)目實(shí)戰(zhàn)之爬取某社區(qū)用戶詳情,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09python+influxdb+shell編寫(xiě)區(qū)域網(wǎng)絡(luò)狀況表
這篇文章主要為大家詳細(xì)介紹了python+influxdb+shell編寫(xiě)區(qū)域網(wǎng)絡(luò)狀況表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Python實(shí)現(xiàn)的RSS閱讀器實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)的RSS閱讀器,實(shí)例分析了XML解析實(shí)現(xiàn)RSS閱讀的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07跟老齊學(xué)Python之復(fù)習(xí)if語(yǔ)句
是否記得,在上一部分,有一講專門介紹if語(yǔ)句的:從if開(kāi)始語(yǔ)句的征程。在學(xué)習(xí)if語(yǔ)句的時(shí)候,對(duì)python編程的基礎(chǔ)知識(shí)了解的還不是很多,或許沒(méi)有做什么太復(fù)雜的東西。本講要對(duì)它進(jìn)行一番復(fù)習(xí),通過(guò)復(fù)習(xí)提高一下。如果此前有的東西忘記了,建議首先回頭看看前面那講。2014-10-10Python實(shí)現(xiàn)隨機(jī)生成手機(jī)號(hào)及正則驗(yàn)證手機(jī)號(hào)的方法
這篇文章主要介紹了Python實(shí)現(xiàn)隨機(jī)生成手機(jī)號(hào)及正則驗(yàn)證手機(jī)號(hào)的方法,涉及Python基于random模塊的隨機(jī)數(shù)以及基于re模塊的正則驗(yàn)證相關(guān)操作技巧,需要的朋友可以參考下2018-04-04用python畫(huà)個(gè)奧運(yùn)五環(huán)(附完整代碼)
大家好,本篇文章主要講的是用python畫(huà)個(gè)奧運(yùn)五環(huán)(附完整代碼),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01numpy和tensorflow中的各種乘法(點(diǎn)乘和矩陣乘)
這篇文章主要介紹了numpy和tensorflow中的各種乘法(點(diǎn)乘和矩陣乘),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03python使用MkDocs自動(dòng)生成文檔的操作方法
python代碼注釋風(fēng)格有很多,比較主流的有 reStructuredText風(fēng)格、numpy風(fēng)格、Google風(fēng)格,自動(dòng)生成文檔的工具也有很多,常見(jiàn)的有:Pydocs,Sphinx和MkDocs,本文給大家介紹了python使用MkDocs自動(dòng)生成文檔的操作方法,需要的朋友可以參考下2024-06-06