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

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)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
性色av香蕉一区二区| 精品二区久久| 国产日韩在线一区| 亚洲欧美日韩一区二区三区在线| 国产精品二区在线| 亚洲欧美日韩在线综合| 国产一二精品视频| 欧美jizzhd精品欧美巨大免费| 亚洲第一二三四五区| 欧美日本一区| 国产精品日韩精品| 久久久久久久999精品视频| 亚洲国产欧美精品| 国产精品久久久久影院色老大 | 国一区二区在线观看| 裸体女人亚洲精品一区| 国产精品一级久久久| 午夜精品久久久久久99热| 韩国精品主播一区二区在线观看| 麻豆精品一区二区av白丝在线| 亚洲精品国产品国语在线app| 欧美体内she精视频在线观看| 久久成人精品一区二区三区| av成人动漫| 国内视频精品| 亚洲欧洲一区二区天堂久久| 欧美日韩伦理在线免费| 在线一区欧美| 国产视频自拍一区| 久久久久国产精品一区| 国产精品日韩久久久久| 欧美成人中文字幕| 久久国产手机看片| 亚洲久久在线| 伊人久久亚洲热| 国产精品专区h在线观看| 在线日韩精品视频| 美乳少妇欧美精品| 欧美在线视频免费| 亚洲一级二级在线| 日韩午夜高潮| 在线观看精品| 黄色成人av网| 激情欧美日韩一区| 国产日韩在线视频| 国产偷国产偷精品高清尤物| 欧美视频在线观看一区| 欧美精品免费观看二区| 欧美α欧美αv大片| 久久久91精品国产| 久久精品国产欧美激情| 欧美影院久久久| 欧美主播一区二区三区| 欧美一级夜夜爽| 欧美一区二区在线看| 亚洲欧美日韩另类| 亚洲欧美国产一区二区三区| 亚洲欧美国产日韩中文字幕| 亚洲一区二区免费看| 欧美日韩综合精品| 一区二区三区四区五区视频| 亚洲美女区一区| a91a精品视频在线观看| 99re亚洲国产精品| 一本久久a久久精品亚洲| 99亚洲一区二区| 亚洲色图在线视频| 午夜视频久久久久久| 欧美有码在线观看视频| 久久久久se| 久久综合九色综合欧美狠狠| 久久野战av| 欧美另类女人| 国产精品一级在线| 国产亚洲成av人片在线观看桃| 狠狠色噜噜狠狠色综合久| 在线精品国产欧美| 亚洲精品在线观看免费| 亚洲男人av电影| 久久综合给合久久狠狠色| 欧美xx视频| 国产欧美日韩不卡免费| 精品成人在线| 一区二区国产精品| 欧美综合二区| 欧美人体xx| 国产亚洲视频在线观看| 亚洲人在线视频| 欧美一级视频| 欧美精品在线一区二区| 国产区精品在线观看| 亚洲日本欧美| 久久精品日产第一区二区| 欧美日韩国内| 亚洲第一精品影视| 西西裸体人体做爰大胆久久久| 欧美成ee人免费视频| 国产精品美女久久久久aⅴ国产馆| 影音先锋中文字幕一区| 亚洲女ⅴideoshd黑人| 欧美**字幕| 国产在线乱码一区二区三区| 一区二区三区精品视频在线观看| 久久综合中文字幕| 国产婷婷一区二区| 中文亚洲免费| 亚洲午夜在线观看视频在线| 久久一区二区三区国产精品| 国产精品高清网站| 亚洲国产人成综合网站| 久久成人精品电影| 国产精品视频导航| 一区二区三区日韩精品| 老司机午夜精品视频| 国产精一区二区三区| 日韩一级免费观看| 欧美成人免费播放| 精品91在线| 久久裸体视频| 国产一区二区三区免费在线观看| 亚洲一区二区三区777| 欧美日韩国产系列| 亚洲精品视频在线看| 久久一综合视频| 国产日韩欧美一二三区| 午夜精品久久久久久久白皮肤| 欧美日韩午夜在线视频| 一本色道久久综合亚洲91| 欧美激情精品久久久六区热门| 影音先锋亚洲一区| 美女尤物久久精品| 91久久久精品| 欧美日韩视频第一区| 亚洲精品一二三区| 欧美日韩在线直播| 亚洲视频在线一区观看| 久久成人免费日本黄色| 久久精品综合网| 国产精品国产三级国产专区53| 在线观看视频一区二区欧美日韩| 亚洲女性裸体视频| 欧美午夜精品久久久久久超碰| 日韩午夜av| 欧美日韩国产小视频| 一本综合精品| 国产精品成人在线观看| 亚洲一二三区在线观看| 国产精品一区二区三区乱码| 午夜精品在线观看| 国产亚洲激情| 噜噜噜躁狠狠躁狠狠精品视频| 尤物网精品视频| 牛牛国产精品| 日韩一级成人av| 国产精品www网站| 午夜精品视频在线观看一区二区| 欧美午夜精品理论片a级大开眼界| 免费在线观看精品| 国产亚洲精品bt天堂精选| 午夜亚洲福利| 国产一区二区视频在线观看| 久久精品欧美日韩精品| 在线观看国产精品淫| 欧美精品二区| 亚洲欧美在线一区| 极品少妇一区二区| 欧美精品一区二| 亚洲综合不卡| 国产尤物精品| 欧美了一区在线观看| 亚洲综合社区| 亚洲国产欧美日韩| 亚洲日本激情| 国产精品日韩一区| 久久一二三国产| 亚洲一区二区不卡免费| 伊人久久噜噜噜躁狠狠躁| 免费不卡中文字幕视频| 亚洲综合视频网| 亚洲黄色在线| 国产亚洲一级高清| 欧美天堂亚洲电影院在线观看 | 久久午夜视频| 在线中文字幕一区| 在线观看国产日韩| 国产欧美一区二区三区在线看蜜臀| 欧美jizz19性欧美| 久久精品水蜜桃av综合天堂| 制服丝袜激情欧洲亚洲| 亚洲二区精品| 狠狠色狠狠色综合人人| 国产精品一区一区| 欧美视频精品在线| 欧美美女操人视频| 你懂的成人av| 另类人畜视频在线| 久久一区视频| 久久永久免费| 久久网站免费| 另类综合日韩欧美亚洲|