查找錯(cuò)誤除了用print()還有什么方法-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,提供網(wǎng)站建設(shè)、做網(wǎng)站,網(wǎng)頁設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

這篇文章將為大家詳細(xì)講解有關(guān)查找錯(cuò)誤除了用print()還有什么方法,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

在這里想問一下有多少小伙伴是在Python中使用print()來輸出某個(gè)變量從而檢查參數(shù)錯(cuò)誤的?

沒禿頭以前我也是這樣做的,后來我為了以后有更多的時(shí)間去修bug,慢慢的發(fā)現(xiàn)斷言是個(gè)好東西,再后來為了直接觀察到整個(gè)程序某個(gè)值的變化過程,發(fā)現(xiàn)還是日志處理是真香。

那么今天就來和大家聊聊Python日志處理的那些梗,記日志是一件很棒的事,它可以很好的幫助我們理解程序中發(fā)生的事以及事情發(fā)生的順序。

在Python中記錄程序運(yùn)行的日志文件時(shí),我們需要調(diào)用logging模塊,通過該模塊,我們很容易的創(chuàng)建自定義的消息記錄,這些日志消息將描述程序執(zhí)行時(shí),何時(shí)達(dá)到日志函數(shù)的調(diào)用,并列出我們想要指定的任何變量當(dāng)時(shí)的值。

另一方面來說呢,如果我們?cè)谌罩疚募邪l(fā)現(xiàn)某些日志消息缺失,這就表明有一部分代碼被跳過,從未執(zhí)行。這意味著什么…嗯,我想作為程序猿的你應(yīng)該也很清楚。

1 使用日志模塊

使用日志消息要啟用logging模塊,在程序運(yùn)行時(shí)將日志信息顯示在屏幕上,所以我們當(dāng)然需要先調(diào)用該模塊了,并且輸入以下代碼:

#調(diào)用logging函數(shù)
import logging
logging.basicConfig(filename='logginginfo.txt', level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')

這行代碼的作用是定義的一個(gè)輸出格式,輸出某一條日志消息執(zhí)行的時(shí)間。

當(dāng)python記錄一個(gè)事件的日志時(shí),它會(huì)創(chuàng)建一個(gè)LogRecord對(duì)象,保存關(guān)于該事件的信息,Logging模塊的函數(shù)讓你能夠指定看到這個(gè)LogRecord對(duì)象的細(xì)節(jié),以及希望的細(xì)節(jié)展示方式。

值得注意的是,當(dāng)我們想要將監(jiān)控的值通過日志文件進(jìn)行輸出時(shí),需要調(diào)用logging.deBug()函數(shù),并且該函數(shù)的輸出方式與print()相同,而這行消息輸出值的格式,就是我們最開始在logging.loasicConfig()中指定的,并且包括我們傳遞給debug()的參數(shù)消息。

以一個(gè)計(jì)算階乘的函數(shù)為例,我們監(jiān)控該函數(shù)中每一個(gè)變量在程序運(yùn)行時(shí)值的變化情況:

#階乘計(jì)算日志消息輸出實(shí)例
import logging
logging.basicConfig( level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
#logging.disable(logging.CRITICAL)
logging.debug("程序測(cè)試:")
def factorial(n):
    logging.debug("階乘數(shù)為:%s" %(n))
    result = 1
    for i in range(1, n + 1):
        result *= i
        logging.debug("此時(shí)乘的數(shù)為:%s, 結(jié)果是%s" %(i, result))
    logging.debug('最終結(jié)果:%s' %(result))
    return result
print(factorial(5))

運(yùn)行結(jié)果:

查找錯(cuò)誤除了用print()還有什么方法

通過這些日志消息的輸出,我們就可以看到在程序執(zhí)行時(shí)該循環(huán)內(nèi)部發(fā)生的值的變動(dòng)的情況,從打印出的日志文件可以看出,Logging.debug()函數(shù)不僅輸出了我們所監(jiān)控的變量的數(shù)值,并且輸出了該函數(shù)在調(diào)用時(shí)的時(shí)間和單詞Bebug。

通過這樣的一個(gè)日志我們就可以非常直觀的看到程序在運(yùn)行過程中的變化情況。

2 不要使用print()調(diào)試程序

現(xiàn)在我們來聊一下,為什么不建議使用print()函數(shù)進(jìn)行值的監(jiān)控輸出,并不是說pintf函數(shù)不能夠?qū)⑽覀儽O(jiān)控的變量值輸出。

而是我們?cè)趯⒊绦蛘{(diào)試完成的時(shí)候,需要花費(fèi)很多時(shí)間從代碼中清除每條日志消息中的print()函數(shù),這樣的話,我們就很有可能一不小將我們期望輸出的內(nèi)容進(jìn)行刪除。

然而,日志消息就很好地避免了這一點(diǎn),我們可以隨心所欲的在程序中添加很多日志變量。

那可能就會(huì)有小伙伴問了,難道使用日志文件輸出的內(nèi)容在最后就不需要禁用了嗎?

當(dāng)然不是的,只是使用logging.debug()輸出的語句在最后不需要我們一個(gè)個(gè)的將其禁用,只需要調(diào)用logging.disable(logging.CRITICAL)就可以完全禁止日志輸出。

不像print()函數(shù)那樣必須將每一行刪除或注釋掉,因此logging.disable模塊讓日志文件的顯示和隱藏變得更加方便快捷。

哈哈,下一步你可能會(huì)認(rèn)為我要說logging.disable()函數(shù)的禁用功能了。

嗯…那接下來我們就來說一下Python中日志消息的級(jí)別,是不是很驚喜?沒事都會(huì)有的喔!

3 日志級(jí)別

我們所調(diào)用的日志文件是有日志級(jí)別的,“日志級(jí)別”提供了一種方式。

這種方式按重要性將日志消息進(jìn)行了分類,五個(gè)日志級(jí)別如下表所示,從最不重要到最重要,利用不同的日志函數(shù)消息,可以按某個(gè)級(jí)別計(jì)入日志并且輸出。

查找錯(cuò)誤除了用print()還有什么方法

日志消息作為一個(gè)字符串,傳遞給這些函數(shù),進(jìn)行日志級(jí)別的劃分只是為了方便對(duì)程序中可能出現(xiàn)的錯(cuò)誤的異常判斷,歸根到底,具體使用哪種級(jí)別的日志消息,還是需要根據(jù)你的程序來定的。

日志級(jí)別的好處就在于,我們可以改變想要看到的日志消息的優(yōu)先級(jí),向basicConfig()函數(shù)傳入logging DEBUG作為level的關(guān)鍵字參數(shù),這將顯示所有日志級(jí)別的消息。

同時(shí)在進(jìn)行某項(xiàng)程序開發(fā)的時(shí)候我們可能并不希望顯示所有的日志消息,這樣我們可以修改level的關(guān)鍵字參數(shù)。

例如:將basicConfig()函數(shù)的level的關(guān)鍵字參數(shù)改為logging.ERROR,這樣將只顯示ERROR級(jí)別和CRITICAL的日志消息,對(duì)于ERROR以下級(jí)別的日志消息并不會(huì)顯示在屏幕上。

例如下面這行代碼,我們只禁用INFO及以下級(jí)別的日志消息,則對(duì)于INFO以上的WARNING消息則不會(huì)禁用

#日志禁用
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
#禁用INFO及以下級(jí)別日志消息
logging.disable(logging.INFO)
logging.debug("程序測(cè)試:")
def factorial(n):
    logging.debug("階乘數(shù)為:%s" %(n))
    result = 1
    for i in range(1, n + 1):
        result *= i
        logging.debug("此時(shí)乘的數(shù)為:%s, 結(jié)果是%s" %(i, result))
    logging.warning('最終結(jié)果:%s' %(result))
    return result
print(factorial(5))

結(jié)果如下:

查找錯(cuò)誤除了用print()還有什么方法

好了,聊完日志的級(jí)別,就該禁用日志出場(chǎng)了!

4 禁用日志

在調(diào)試完成以后,我們當(dāng)然不希望所有這些日志出現(xiàn)在屏幕之上,這時(shí)我們需要調(diào)用logging.disable函數(shù)禁用這些消息,這樣這些日志消息就不必進(jìn)入到程序之中手動(dòng)刪除或者將所有日志注釋掉,只需要向logging.disable傳入一個(gè)級(jí)別,他就會(huì)禁止該級(jí)別和更低級(jí)的所有日志消息,

所以如果想要禁用所有日志,只需要向程序中添加

logging.disable(logging.CRITICAL),

同時(shí)還有一點(diǎn)需要注意的是:logging.disable()函數(shù)將禁用他之后的所有該級(jí)別及以下的消息。

所以在這里我們就可以將禁用日志消息的logging.disable()函數(shù)放在程序文件的最前方,調(diào)用import logging模塊之下,這樣就很容易找到,并且根據(jù)需要來注釋掉,從而啟用或禁用日志消息的作用。

5 將日志記錄到文件

我們除了將日志消息顯示在屏幕上以外,還可以將它們寫入到文本文件之中,這樣做目的是為了我們?cè)谶M(jìn)行程序調(diào)試的時(shí)候,不至于很多日志文件顯示在屏幕,從而影響我們對(duì)變量的讀取的讀取,在rogging.basicConfig函數(shù)接收filename關(guān)鍵字為參數(shù),像這樣:

#將日志寫入文件
logging.basicConfig(filename='logginginfo.txt', level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')

之后日志消息就會(huì)被保存到某一特定的文本文件中,同樣使用求階乘的函數(shù),將日志消息存入txt文件中

查找錯(cuò)誤除了用print()還有什么方法

這樣程序輸出的結(jié)果中就只會(huì)有我們使用print()想要輸出的內(nèi)容,對(duì)于日志消息,則會(huì)保存在相應(yīng)的日志文件中去。

查找錯(cuò)誤除了用print()還有什么方法

雖然日志消息很有用,但如果不存入文件顯示,就可能會(huì)和我們想要輸出的結(jié)果一同顯示在屏幕上,讓我們很難找到程序中真正的輸出。將日志信息寫入到文件以后,這樣就會(huì)使屏幕變得干凈整潔,就能夠很好的保存信息。

這樣在程序運(yùn)行之后,如果發(fā)現(xiàn)某些程序錯(cuò)誤,我們就可以直接在該文本文件中讀取日志,查看變量信息。

關(guān)于查找錯(cuò)誤除了用print()還有什么方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)頁題目:查找錯(cuò)誤除了用print()還有什么方法-創(chuàng)新互聯(lián)
URL分享:http://muchs.cn/article30/ioeso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、服務(wù)器托管網(wǎng)站維護(hù)、網(wǎng)站排名移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)