亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中使用logging模塊代替print(logging簡(jiǎn)明指南)

 更新時(shí)間:2014年07月09日 09:24:41   投稿:junjie  
這篇文章主要介紹了Python中使用logging模塊代替print的好處說(shuō)明,主旨是logging模塊簡(jiǎn)明指南,logging模塊的使用方法介紹,需要的朋友可以參考下

替換print?print怎么了?

print 可能是所有學(xué)習(xí)Python語(yǔ)言的人第一個(gè)接觸的東西。它最主要的功能就是往控制臺(tái) 打印一段信息,像這樣:

復(fù)制代碼 代碼如下:

print 'Hello, logging!'

print也是絕大多數(shù)人用來(lái)調(diào)試自己的程序用的最多的東西,就像寫js使用 console.log 一樣那么自然。很多剛剛開始學(xué)習(xí)Python的新手甚至有一定經(jīng)驗(yàn)的老手,都在使用print 來(lái)調(diào)試他們的代碼。

比如這是一個(gè)我寫的輸出 斐波那契數(shù)列 的小程序,讓我們來(lái)看看它的代碼:

復(fù)制代碼 代碼如下:

# -*- coding: utf-8 -*-
"""
A simple fibonacci program
"""
import argparse

parser = argparse.ArgumentParser(description='I print fibonacci sequence')
parser.add_argument('-s', '--start', type=int, dest='start',
                    help='Start of the sequence', required=True)
parser.add_argument('-e', '--end', type=int, dest='end',
                    help='End of the sequence', required=True)

def infinite_fib():
    a, b = 0, 1
    yield a
    yield b
    while True:
        #print 'Before caculation: a, b = %s, %s' % (a, b)
        a, b = b, a + b
        #print 'After caculation: a, b = %s, %s' % (a, b)
        yield b


def fib(start, end):
    for cur in infinite_fib():
        #print 'cur: %s, start: %s, end: %s' % (cur, start, end)
        if cur > end:
            return
        if cur >= start:
            #print 'Returning result %s' % cur
            yield cur

def main():
    args = parser.parse_args()
    for n in fib(args.start, args.end):
        print n,

if __name__ == '__main__':
    main()


讓我們來(lái)看看它工作的怎么樣:

復(fù)制代碼 代碼如下:

$ python fib.py  -s 1 -e 100
1 1 2 3 5 8 13 21 34 55 89
$ python fib.py  -s 100 -e 1000
144 233 377 610 987

沒(méi)有任何問(wèn)題,程序正確的完成了它的功能。但等等, 程序里面的那一堆被注釋掉的print語(yǔ)句是怎么回事?

原來(lái),這是我編寫這個(gè)小程序的過(guò)程中,用來(lái) 調(diào)試(DEBUG) 的輸出信息,在我完成了這 個(gè)程序以后,我自然就把這些print給注釋掉了。讓我們來(lái)看看如果把這個(gè)print語(yǔ)句打開后結(jié)果會(huì)怎么樣?

復(fù)制代碼 代碼如下:

$ python fib.py  -s 1 -e 100
cur: 0, start: 1, end: 100
cur: 1, start: 1, end: 100
Returning result 1
1 Before caculation: a, b = 0, 1
After caculation: a, b = 1, 1
cur: 1, start: 1, end: 100
... ...
... ...
(不計(jì)其數(shù)的輸出信息)

如你所見(jiàn),所有的計(jì)算過(guò)程都被打印出來(lái)了。

寫的時(shí)候加上print,提交代碼的時(shí)候還得記得把print語(yǔ)句刪掉/注釋掉,為什么我們要忍受這樣的麻煩事呢? 讓我們來(lái)介紹我們的主角 logging ,它幾乎就是為這種使用情景而生的。

更好的做法,使用logging模塊

logging模塊是Python內(nèi)置的日志模塊,使用它可以非常輕松的處理和管理日志輸出。 logging模塊最簡(jiǎn)單的用法,是直接使用basicConfig方法來(lái)對(duì)logging進(jìn)行配置:

復(fù)制代碼 代碼如下:

import logging

# 設(shè)置默認(rèn)的level為DEBUG
# 設(shè)置log的格式
logging.basicConfig(
    level=logging.DEBUG,
    format="[%(asctime)s] %(name)s:%(levelname)s: %(message)s"
)

# 記錄log
logging.debug(...)
logging.info(...)
logging.warn(...)
logging.error(...)
logging.critical(...)


這樣配置完logging以后,然后使用``logging.debug``來(lái)替換所有的print語(yǔ)句就可以了。 我們會(huì)看到這樣的輸出:

復(fù)制代碼 代碼如下:

[2014-03-18 15:17:45,216] root:cur: 0, start: 1, end: 100
[2014-03-18 15:17:45,216] root:DEBUG: cur: 1, start: 1, end: 100
[2014-03-18 15:17:45,216] root:DEBUG: Returning result 1
[2014-03-18 15:17:45,216] root:DEBUG: Before caculation: a, b = 0, 1
... ...

使用真正的logger

上面說(shuō)的basicConfig方法可以滿足你在絕大多數(shù)場(chǎng)景下的使用需求,但是basicConfig有一個(gè) 很大的缺點(diǎn)。

調(diào)用basicConfig其實(shí)是給root logger添加了一個(gè)handler,這樣當(dāng)你的程序和別的使用了 logging的第三方模塊一起工作時(shí),會(huì)影響第三方模塊的logger行為。這是由logger的繼承特性決定的。

所以我們需要使用真正的logger:

復(fù)制代碼 代碼如下:

import logging

# 使用一個(gè)名字為fib的logger
logger = logging.getLogger('fib')

# 設(shè)置logger的level為DEBUG
logger.setLevel(logging.DEBUG)

# 創(chuàng)建一個(gè)輸出日志到控制臺(tái)的StreamHandler
hdr = logging.StreamHandler()
formatter = logging.Formatter('[%(asctime)s] %(name)s:%(levelname)s: %(message)s')
hdr.setFormatter(formatter)

# 給logger添加上handler
logger.addHandler(hdr)

這樣再使用logger來(lái)進(jìn)行日志輸出就行了。不過(guò)這樣的壞處就是代碼量比basicConfig要大不少。 所以我建議如果是非常簡(jiǎn)單的小腳本的話,直接使用basicConfig就可以,如果是稍微大一些 項(xiàng)目,建議認(rèn)真配置好logger。

動(dòng)態(tài)控制腳本的所有輸出

使用了logging模塊以后,通過(guò)修改logger的log level,我們就可以方便的控制程序的輸出了。 比如我們可以為我們的斐波那契數(shù)列添加一個(gè) -v 參數(shù),來(lái)控制打印所有的調(diào)試信息。

復(fù)制代碼 代碼如下:

# 添加接收一個(gè)verbose參數(shù)
parser.add_argument('-v', '--verbose', action='store_true', dest='verbose',
                    help='Enable debug info')

# 判斷verbose
if args.verbose:
    logger.setLevel(logging.DEBUG)
else:
    logger.setLevel(logging.ERROR)

這樣,默認(rèn)情況下,我們的小程序是不會(huì)打印調(diào)試信息的,只有當(dāng)傳入`-v/--verbose`的時(shí)候, 我們才會(huì)打印出額外的debug信息,就像這樣:

復(fù)制代碼 代碼如下:

$ python fib.py  -s 1 -e 100
1 1 2 3 5 8 13 21 34 55 89

$ python fib.py  -s 1 -e 100 -v
[2014-03-18 15:17:45,216] fib:DEBUG: cur: 0, start: 1, end: 100
[2014-03-18 15:17:45,216] fib:DEBUG: cur: 1, start: 1, end: 100
[2014-03-18 15:17:45,216] fib:DEBUG: Returning result 1
[2014-03-18 15:17:45,216] fib:DEBUG: Before caculation: a, b = 0, 1
... ...

如你所見(jiàn),使用了logging以后,什么時(shí)候需要打印DEBUG信息,什么時(shí)候需要關(guān)閉, 一切變的無(wú)比簡(jiǎn)單。

所以,趕緊用logging替換掉你的腳本里的print吧!

延伸閱讀

以上這些只是介紹了logging模塊最簡(jiǎn)單的一些功能,作為print的替代品來(lái)使用,logging 模塊還有很多非常強(qiáng)大好用的功能,比如從文件讀取配置、各種各樣的Handlers等等。 建議閱讀一下logging的官方文檔:

1.logging Logging facility for Python
2.Logging HOWTO

最后附上使用logging模塊的斐波那契數(shù)列程序完整代碼:

復(fù)制代碼 代碼如下:

# -*- coding: utf-8 -*-
"""
A simple fibonacci program
"""
import argparse

parser = argparse.ArgumentParser(description='I print fibonacci sequence')
parser.add_argument('-s', '--start', type=int, dest='start',
                    help='Start of the sequence', required=True)
parser.add_argument('-e', '--end', type=int, dest='end',
                    help='End of the sequence', required=True)
parser.add_argument('-v', '--verbose', action='store_true', dest='verbose',
                    help='Enable debug info')

import logging

logger = logging.getLogger('fib')
logger.setLevel(logging.DEBUG)

hdr = logging.StreamHandler()
formatter = logging.Formatter('[%(asctime)s] %(name)s:%(levelname)s: %(message)s')
hdr.setFormatter(formatter)

logger.addHandler(hdr)


def infinite_fib():
    a, b = 0, 1
    yield a
    yield b
    while True:
        logger.debug('Before caculation: a, b = %s, %s' % (a, b))
        a, b = b, a + b
        logger.debug('After caculation: a, b = %s, %s' % (a, b))
        yield b


def fib(start, end):
    for cur in infinite_fib():
        logger.debug('cur: %s, start: %s, end: %s' % (cur, start, end))
        if cur > end:
            return
        if cur >= start:
            logger.debug('Returning result %s' % cur)
            yield cur

def main():
    args = parser.parse_args()
    if args.verbose:
        logger.setLevel(logging.DEBUG)
    else:
        logger.setLevel(logging.ERROR)

    for n in fib(args.start, args.end):
        print n,

if __name__ == '__main__':
    main()

相關(guān)文章

  • conda查看、創(chuàng)建、刪除、激活與退出環(huán)境命令詳解

    conda查看、創(chuàng)建、刪除、激活與退出環(huán)境命令詳解

    在不同的項(xiàng)目中經(jīng)常需要conda來(lái)配置環(huán)境,這樣能夠?qū)崿F(xiàn)不同版本的python和庫(kù)的隨意切換,并且減少了很多不必要的麻煩,下面這篇文章主要給大家介紹了關(guān)于conda查看、創(chuàng)建、刪除、激活與退出環(huán)境命令的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Python基于list的append和pop方法實(shí)現(xiàn)堆棧與隊(duì)列功能示例

    Python基于list的append和pop方法實(shí)現(xiàn)堆棧與隊(duì)列功能示例

    這篇文章主要介紹了Python基于list的append和pop方法實(shí)現(xiàn)堆棧與隊(duì)列功能,結(jié)合實(shí)例形式分析了Python使用list定義及使用隊(duì)列的相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • Python利用shutil實(shí)現(xiàn)拷貝文件功能

    Python利用shutil實(shí)現(xiàn)拷貝文件功能

    shutil?是一個(gè)?Python?內(nèi)置模塊,該模塊對(duì)文件的復(fù)制、刪除和壓縮等操作都提供了非常方便的支持。本文將利用shutil實(shí)現(xiàn)拷貝文件功能,需要的可以參考一下
    2022-07-07
  • 利用Python和C++解析gltf文件的示例詳解

    利用Python和C++解析gltf文件的示例詳解

    gltf,全稱是GL Transmission Format,是一種開放的3D文件格式,Python和C++是兩個(gè)非常強(qiáng)大的工具,下面我們就來(lái)看看如何結(jié)合這兩種語(yǔ)言來(lái)實(shí)現(xiàn)gltf文件的解析吧
    2025-03-03
  • python3用PIL把圖片轉(zhuǎn)換為RGB圖片的實(shí)例

    python3用PIL把圖片轉(zhuǎn)換為RGB圖片的實(shí)例

    今天小編就為大家分享一篇python3用PIL把圖片轉(zhuǎn)換為RGB圖片的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • python將word的doc另存為docx的實(shí)現(xiàn)方案

    python將word的doc另存為docx的實(shí)現(xiàn)方案

    在 Python 中,你可以使用 python-docx 庫(kù)來(lái)操作 Word 文檔,不過(guò)需要注意的是,.doc 是舊的 Word 格式,而 .docx 是新的基于 XML 的格式,python-docx 只能處理 .docx 格式,需要的朋友可以參考下
    2025-08-08
  • Python實(shí)現(xiàn)抓取騰訊視頻所有電影的示例代碼

    Python實(shí)現(xiàn)抓取騰訊視頻所有電影的示例代碼

    這篇文章主要為大家介紹了如何使用python實(shí)現(xiàn)抓取騰訊視頻所有電影,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • pytorch中使用cuda擴(kuò)展的實(shí)現(xiàn)示例

    pytorch中使用cuda擴(kuò)展的實(shí)現(xiàn)示例

    這篇文章主要介紹了pytorch中使用cuda擴(kuò)展的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • python中的format是什么意思,format怎么用

    python中的format是什么意思,format怎么用

    這篇文章主要介紹了python中的format是什么意思?format怎么用?今天小編就為大家介紹一下format用法,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 基于python實(shí)現(xiàn)音樂(lè)播放器代碼實(shí)例

    基于python實(shí)現(xiàn)音樂(lè)播放器代碼實(shí)例

    這篇文章主要介紹了基于python實(shí)現(xiàn)音樂(lè)播放器代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論