欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python編寫(xiě)簡(jiǎn)單實(shí)用的日志裝飾器

 更新時(shí)間:2022年05月20日 09:37:07   作者:Ckend  
在寫(xiě)代碼的時(shí)候,往往會(huì)漏掉日志這個(gè)關(guān)鍵因素,導(dǎo)致功能在使用的時(shí)候出錯(cuò)卻無(wú)法溯源。這個(gè)時(shí)候只要利用日志裝飾器就能解決,本文將用Python自制一個(gè)簡(jiǎn)單實(shí)用的日志裝飾器,需要的可以參考一下

在寫(xiě)代碼的時(shí)候,往往會(huì)漏掉日志這個(gè)關(guān)鍵因素,導(dǎo)致功能在使用的時(shí)候出錯(cuò)卻無(wú)法溯源。

其實(shí),只需要寫(xiě)一個(gè)非常簡(jiǎn)單的日志裝飾器,我們就能大大提升排查問(wèn)題的效率。

1.簡(jiǎn)陋版裝飾器

寫(xiě)一個(gè)裝飾器非常簡(jiǎn)單,因?yàn)楸举|(zhì)上裝飾器就是一個(gè)返回函數(shù)的“高階”函數(shù)而已:

1) 函數(shù)作為參數(shù)傳遞進(jìn)裝飾器。

2) 裝飾器內(nèi)定義一個(gè)函數(shù),處理作為參數(shù)傳遞進(jìn)來(lái)的函數(shù)。

3) 返回這個(gè)裝飾器內(nèi)定義的函數(shù)

import datetime

def log(func):
    """
    日志裝飾器,簡(jiǎn)單記錄函數(shù)的日志

    Args:
        func (function): 函數(shù)
    """
    def inner(*args):
        timestamp = str(datetime.datetime.now()).split(".")[0]
        res = func(*args)
        print(f"[{timestamp}] ({func.__name__}) {args} -> {res}")
        return res
    return inner

用一下試試看:

@log
def pluser(a, b):
    return a + b

pluser(1, 2)

效果如下:

雖然這樣可以實(shí)現(xiàn)我們所需要的功能,但其實(shí)有很大的優(yōu)化空間。

2.普通版裝飾器

第一版代碼中有一個(gè)顯而易見(jiàn)的問(wèn)題,裝飾器內(nèi)定義的處理函數(shù)不支持kwargs,而在裝飾器中支持kwargs僅僅是舉手之勞而已。

第二個(gè)問(wèn)題是,生成時(shí)間戳的時(shí)候采用字符串截取的形式,這種形式過(guò)于粗暴。其實(shí)可以使用strftime做字符串轉(zhuǎn)換。

修改如下:

import datetime

def log(func):
    """
    日志裝飾器,簡(jiǎn)單記錄函數(shù)的日志

    Args:
        func (function): 函數(shù)
    """
    def inner(*args, **kwargs):
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        res = func(*args, **kwargs)
        print(f"[{timestamp}] ({func.__name__}) {args} -> {res}")
        return res
    return inner

似乎優(yōu)化得差不多了,不過(guò)依然存在改進(jìn)空間。

3.優(yōu)化版裝飾器

在前兩版代碼中,我們使用print進(jìn)行日志輸出,其實(shí)這種處理日志的方式并不標(biāo)準(zhǔn)。

使用logging模塊控制日志輸出是一個(gè)更好地選擇。

為了使用logging模塊記錄日志,我們需要先配置好logging相關(guān)的選項(xiàng)。

1) 首先,生成一個(gè)日志記錄器,并配置日志等級(jí):

import logging

# 獲取日志記錄器,配置日志等級(jí)
logger = logging.getLogger(__name__)
logger.setLevel('DEBUG')

2) 配置日志格式、增加handler控制輸出流:

# 默認(rèn)日志格式
formatter = logging.Formatter("%(asctime)s - [%(levelname)s] - %(message)s")
# 輸出到控制臺(tái)的handler
chlr = logging.StreamHandler()
# 配置默認(rèn)日志格式
chlr.setFormatter(formatter)

此處可以設(shè)置handler所需要處理的日志等級(jí),沒(méi)有設(shè)置則默認(rèn)使用logger自身的Level,即DEBUG等級(jí)。

3) 最后,將此handler加入到日志記錄器內(nèi):

# 日志記錄器增加此handler
logger.addHandler(chlr)

logging 完整配置如下:

import logging

# 獲取日志記錄器,配置日志等級(jí)
logger = logging.getLogger(__name__)
logger.setLevel('DEBUG')

# 默認(rèn)日志格式
formatter = logging.Formatter("%(asctime)s - [%(levelname)s] - %(message)s")
# 輸出到控制臺(tái)的handler
chlr = logging.StreamHandler()
# 配置默認(rèn)日志格式
chlr.setFormatter(formatter)

# 日志記錄器增加此handler
logger.addHandler(chlr)

使用的時(shí)候非常簡(jiǎn)單,就是把print換成logger.debug即可:

def log(func):
    """
    日志裝飾器,簡(jiǎn)單記錄函數(shù)的日志

    Args:
        func (function): 函數(shù)
    """
    def inner(*args, **kwargs):
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        res = func(*args, **kwargs)
        logger.debug(f"func: {func.__name__} {args} -> {res}")
        return res
    return inner

效果如下:

這樣,一個(gè)比較完善的日志裝飾器就完成了。

附常用的日志等級(jí)配置:

以上就是基于Python編寫(xiě)簡(jiǎn)單實(shí)用的日志裝飾器的詳細(xì)內(nèi)容,更多關(guān)于Python日志裝飾器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

  • Mac下使用HomeBrew安裝python3

    Mac下使用HomeBrew安裝python3

    這篇文章介紹了Mac下使用HomeBrew安裝python3的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 使用python實(shí)現(xiàn)鏈表操作

    使用python實(shí)現(xiàn)鏈表操作

    鏈表是計(jì)算機(jī)科學(xué)里面應(yīng)用最廣泛的數(shù)據(jù)結(jié)構(gòu)之一。這篇文章主要介紹了使用python實(shí)現(xiàn)鏈表操作,需要的朋友可以參考下
    2018-01-01
  • python如何把字符串類(lèi)型list轉(zhuǎn)換成list

    python如何把字符串類(lèi)型list轉(zhuǎn)換成list

    這篇文章主要介紹了python如何吧字符串類(lèi)型list轉(zhuǎn)換成list,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python實(shí)現(xiàn)拼音轉(zhuǎn)換

    Python實(shí)現(xiàn)拼音轉(zhuǎn)換

    拼音轉(zhuǎn)換指的是將漢字轉(zhuǎn)為拼音的過(guò)程。本文介紹了Python實(shí)現(xiàn)拼音轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Python實(shí)現(xiàn)全自動(dòng)安裝第三方庫(kù)的方法

    Python實(shí)現(xiàn)全自動(dòng)安裝第三方庫(kù)的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)全自動(dòng)安裝第三方庫(kù)的方法,一說(shuō)Python要安裝哪個(gè)模塊,我們第一反應(yīng),win+r輸入cmd,pip?instll安裝,但是如果換電腦了,Python第三方庫(kù)那么多,難道要一次一次的敲擊pip?install,本文就介紹一個(gè)簡(jiǎn)單的方法解放雙手,需要的朋友可以參考下
    2023-07-07
  • 關(guān)于keras.layers.Conv1D的kernel_size參數(shù)使用介紹

    關(guān)于keras.layers.Conv1D的kernel_size參數(shù)使用介紹

    這篇文章主要介紹了關(guān)于keras.layers.Conv1D的kernel_size參數(shù)使用介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用

    Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用

    csv文件是一種逗號(hào)分隔的純文本形式存儲(chǔ)的表格數(shù)據(jù),Python內(nèi)置了CSV模塊,可直接通過(guò)該模塊實(shí)現(xiàn)csv文件的讀寫(xiě)操作,下面這篇文章主要給大家介紹了關(guān)于Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用,需要的朋友可以參考下
    2022-09-09
  • Python 操作 MySQL數(shù)據(jù)庫(kù)

    Python 操作 MySQL數(shù)據(jù)庫(kù)

    這篇文章主要介紹了Python 如何操作 MySQL,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • 最新評(píng)論