中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

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

替換print?print怎么了?

print 可能是所有學習Python語言的人第一個接觸的東西。它最主要的功能就是往控制臺 打印一段信息,像這樣:

代碼如下:

print 'Hello, logging!'

print也是絕大多數人用來調試自己的程序用的最多的東西,就像寫js使用 console.log 一樣那么自然。很多剛剛開始學習Python的新手甚至有一定經驗的老手,都在使用print 來調試他們的代碼。

比如這是一個我寫的輸出 斐波那契數列 的小程序,讓我們來看看它的代碼:

代碼如下:

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

讓我們來看看它工作的怎么樣:

代碼如下:

$ 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

沒有任何問題,程序正確的完成了它的功能。但等等, 程序里面的那一堆被注釋掉的print語句是怎么回事?

原來,這是我編寫這個小程序的過程中,用來 調試(DEBUG) 的輸出信息,在我完成了這 個程序以后,我自然就把這些print給注釋掉了。讓我們來看看如果把這個print語句打開后結果會怎么樣?

代碼如下:

$ 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

... ...

... ...

(不計其數的輸出信息)

如你所見,所有的計算過程都被打印出來了。

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

更好的做法,使用logging模塊

logging模塊是Python內置的日志模塊,使用它可以非常輕松的處理和管理日志輸出。 logging模塊最簡單的用法,是直接使用basicConfig方法來對logging進行配置:

代碼如下:

import logging

# 設置默認的level為DEBUG

# 設置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``來替換所有的print語句就可以了。 我們會看到這樣的輸出:

代碼如下:

[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

上面說的basicConfig方法可以滿足你在絕大多數場景下的使用需求,但是basicConfig有一個 很大的缺點。

調用basicConfig其實是給root logger添加了一個handler,這樣當你的程序和別的使用了 logging的第三方模塊一起工作時,會影響第三方模塊的logger行為。這是由logger的繼承特性決定的。

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

代碼如下:

import logging

# 使用一個名字為fib的logger

logger = logging.getLogger('fib')

# 設置logger的level為DEBUG

logger.setLevel(logging.DEBUG)

# 創建一個輸出日志到控制臺的StreamHandler

hdr = logging.StreamHandler()

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

hdr.setFormatter(formatter)

# 給logger添加上handler

logger.addHandler(hdr)

這樣再使用logger來進行日志輸出就行了。不過這樣的壞處就是代碼量比basicConfig要大不少。 所以我建議如果是非常簡單的小腳本的話,直接使用basicConfig就可以,如果是稍微大一些 項目,建議認真配置好logger。

動態控制腳本的所有輸出

使用了logging模塊以后,通過修改logger的log level,我們就可以方便的控制程序的輸出了。 比如我們可以為我們的斐波那契數列添加一個 -v 參數,來控制打印所有的調試信息。

代碼如下:

# 添加接收一個verbose參數

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)

這樣,默認情況下,我們的小程序是不會打印調試信息的,只有當傳入`-v/--verbose`的時候, 我們才會打印出額外的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

... ...

如你所見,使用了logging以后,什么時候需要打印DEBUG信息,什么時候需要關閉, 一切變的無比簡單。

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

延伸閱讀

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

1.logging Logging facility for Python

2.Logging HOWTO

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

代碼如下:

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

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
黄色欧美成人| 欧美国产激情| 在线看片成人| 欧美一区二区高清在线观看| 麻豆成人小视频| 国产精品免费视频xxxx| 影音先锋久久精品| 韩日欧美一区二区三区| 亚洲第一搞黄网站| 亚洲一区国产| 欧美精品色网| 久久在线精品| 欧美日韩一区二区在线观看视频| 欧美日韩一区二区三区免费看| 在线精品在线| 一本久道久久久| 欧美韩日一区二区三区| 国内视频一区| 麻豆精品视频在线观看| 国产精品激情电影| 亚洲欧洲在线免费| 一区二区免费在线观看| 欧美日韩成人一区二区| 欧美在线观看www| 中文高清一区| 久久婷婷国产综合精品青草| 久久综合激情| 国外成人免费视频| 欧美影视一区| 极品裸体白嫩激情啪啪国产精品| 亚洲欧美在线网| 韩国亚洲精品| 欧美人交a欧美精品| 精品成人一区| 国产日韩一级二级三级| 篠田优中文在线播放第一区| 欧美日韩情趣电影| 欧美在线首页| 日韩一二在线观看| 国产精品视频免费| 久久国产天堂福利天堂| 亚洲黄网站在线观看| 国产视频亚洲精品| 欧美午夜宅男影院在线观看| 久久亚洲一区二区| 另类图片综合电影| 国外精品视频| 国产精品综合视频| 美女在线一区二区| 亚洲精品在线观看视频| 国产日韩专区在线| 永久555www成人免费| 欧美激情视频在线播放| 久久久久综合网| 欧美一区二区三区在线看| 亚洲欧美日韩中文视频| 国产精品国产三级国产| 欧美日韩综合一区| 欧美精品一区二区三区在线播放| 久久av在线| 久久久久久久久蜜桃| 亚洲一区二区三区欧美| 99精品99| 久久精品国产亚洲5555| 欧美在线www| 欧美精品首页| 久久久999| 久久久久网址| 在线观看日韩欧美| 亚洲精品乱码久久久久| 亚洲特色特黄| 久久嫩草精品久久久精品一| 欧美在线一区二区| 久久在线视频| 国产精品免费一区豆花| 国产欧美日本| 国产真实乱偷精品视频免| 永久域名在线精品| 这里只有精品电影| 久久久久综合一区二区三区| 欧美黄色一区| 国产专区欧美精品| 亚洲伦理久久| 亚洲图片你懂的| 久久五月激情| 国产在线精品一区二区夜色| 一本久道久久久| 欧美韩日视频| 亚洲日本精品国产第一区| 久久精品道一区二区三区| 欧美福利专区| 国产一级揄自揄精品视频| 亚洲一区国产| 欧美大片在线看免费观看| 国产亚洲一区在线播放| 日韩视频在线免费| 欧美国产一区二区三区激情无套| 欧美精品成人| 亚洲麻豆国产自偷在线| 蜜臀久久久99精品久久久久久 | 久久一区国产| 国产精品mv在线观看| 亚洲精品一级| 久久久久欧美| 一区二区高清| 久久精品国产综合精品| 欧美激情乱人伦| 欧美日韩国产精品一区| 日韩一二三在线视频播| 欧美在线播放视频| 亚洲国产黄色| 亚洲国产精品传媒在线观看| 国产色视频一区| 欧美www在线| 久久―日本道色综合久久| 性欧美18~19sex高清播放| 国产一区在线免费观看| 久久精品在线观看| 亚洲电影免费观看高清完整版在线观看| 久久国产福利| 亚洲欧洲一二三| 国产午夜精品久久久久久免费视| 欧美激情一区二区三区高清视频| 久久精品免费电影| 一区二区三区视频在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲国产精品一区二区www| 欧美三日本三级少妇三2023| 国产精品自在欧美一区| 欧美体内she精视频| 国产精品va在线播放| 欧美一区二区在线免费播放| 麻豆精品传媒视频| 久久嫩草精品久久久精品一| 亚洲一区二区三区精品动漫| 午夜精品久久久| 欧美日本一区二区视频在线观看| 欧美视频在线免费| 黄色一区二区三区| 欧美亚洲一区在线| 久久精品中文字幕一区| 99成人在线| 欧美日韩中文在线观看| 国内精品一区二区三区| 亚洲精品久久久久中文字幕欢迎你 | 99riav1国产精品视频| 一区二区亚洲精品国产| 亚洲国产天堂久久国产91| 狠狠干综合网| 亚洲天堂网在线观看| 欧美日韩国产一区二区三区地区 | 亚洲精品韩国| 欧美在线free| 欧美日韩国产一区二区三区地区| 欧美日产在线观看| 欧美专区在线观看| 久久精品中文字幕一区| avtt综合网| 999亚洲国产精| 欧美激情欧美狂野欧美精品| 久久大香伊蕉在人线观看热2| 影音先锋亚洲一区| 伊人春色精品| 国产亚洲第一区| 一区二区亚洲欧洲国产日韩| 亚洲狠狠婷婷| 欧美亚洲成人免费| 国产日韩欧美亚洲一区| 亚洲人在线视频| 玖玖玖免费嫩草在线影院一区| 久久精品九九| 国产真实乱偷精品视频免| 免费在线亚洲| aa国产精品| 欧美专区在线观看| 国产毛片一区| 亚洲综合99| 亚洲日本中文字幕| 欧美成人精品不卡视频在线观看 | 欧美成人69| 日韩视频精品在线| 欧美日韩一区二| 影音先锋日韩资源| 国产性做久久久久久| 欧美视频福利| 欧美成年网站| 美国十次了思思久久精品导航| 噜噜噜在线观看免费视频日韩| 亚洲一区二区三区涩| 免费永久网站黄欧美| 中国日韩欧美久久久久久久久| 久久精品视频播放| 国产精品久久久久999| 亚洲精品影视| 久久亚洲一区二区| 在线精品一区| 欧美一区二区视频97| 欧美专区在线播放| 久久久久.com| 欧美日韩国产欧|