午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    Python中使用logging模塊代替print(logging簡(jiǎn)明指南)
    來(lái)源:易賢網(wǎng) 閱讀:1132 次 日期:2014-07-11 18:58:24
    溫馨提示:易賢網(wǎng)小編為您整理了“Python中使用logging模塊代替print(logging簡(jiǎn)明指南)”,方便廣大網(wǎng)友查閱!

    替換print?print怎么了?

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

    代碼如下:

    print 'Hello, logging!'

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

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

    代碼如下:

    # -*- 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)看看它工作的怎么樣:

    代碼如下:

    $ 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ǔ)句打開(kāi)后結(jié)果會(huì)怎么樣?

    代碼如下:

    $ 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)行配置:

    代碼如下:

    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ì)看到這樣的輸出:

    代碼如下:

    [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:

    代碼如下:

    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)試信息。

    代碼如下:

    # 添加接收一個(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信息,就像這樣:

    代碼如下:

    $ 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ù)列程序完整代碼:

    代碼如下:

    # -*- 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()

    更多信息請(qǐng)查看IT技術(shù)專欄

    更多信息請(qǐng)查看腳本欄目
    易賢網(wǎng)手機(jī)網(wǎng)站地址:Python中使用logging模塊代替print(logging簡(jiǎn)明指南)
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2025國(guó)考·省考課程試聽(tīng)報(bào)名

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)