第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定

豐富你的日志信息:從Python調(diào)用堆棧獲取行號等信息

標(biāo)簽:
Python

程序中的日志打印,或者消息上传,比如kafka消息等等。经常上传的消息中需要上传堆栈信息中的文件名、行号、上层调用者等具体用于定位的消息。Python提供了以下两种方法:

  • sys._getframe, 基础方法
  • inspect.currentframe, 推荐方法,提供除了sys._getframe方法之外更多的frame相关的方法

具体使用如下

使用sys._getframe私有方法

具体使用方法如下:

import os
import sys


def get_cur_info():
	"""
        获取调用时的文件名,行号,上层调用者的名称
        :return: 文件名,行号,上层调用者名称
    """
	try:
		current_frame = sys._getframe(2)
		return os.path.basename(current_frame.f_code.co_filename), current_frame.f_lineno, current_frame.f_code.co_name
	except ValueError:
		return 'unknown', 0, 'unknown'

具体的函数输出结果演示可以参见下面的inspect模块结果

使用inspect模块(推荐)

相比于sys的内置私有方法,更推荐inspect模块。inspect模块的具体使用方法如下

import os
import inspect

def get_cur_info():
	try:
		current_frame = inspect.currentframe(2)
		return os.path.basename(current_frame.f_code.co_filename), current_frame.f_lineno, current_frame.f_code.co_name
	except ValueError:
		return 'unknown', 0, 'unknown'


def produce():
	return get_cur_info()


def business():
	return produce()


if __name__ == '__main__':
	print(get_cur_info())  # 输出 ('unknown', 0, 'unknown')

	print(produce())  # 输出 ('a.py', 22, '')

	print(business())  # 输出 ('a.py', 16, 'business')

主要依赖inspect.currentframe方法,关于inspect.currentframe方法的使用见帮助文档

>>> help(inspect.currentframe)
Help on built-in function _getframe in module sys:

_getframe(...)
    _getframe([depth]) -> frameobject
    
    Return a frame object from the call stack.  If optional integer depth is
    given, return the frame object that many calls below the top of the stack.
    If that is deeper than the call stack, ValueError is raised.  The default
    for depth is zero, returning the frame at the top of the call stack.
    
    This function should be used for internal and specialized
    purposes only.

从调用堆栈返回一个帧对象。深度为整数,默认为0,返回调用堆栈顶部的帧。如果指定深度比调用堆栈深,会抛出ValueError异常。该功能应该只用于内部和专业目的。

inspect.currentframe方法的实现见内置库inspect.py

if hasattr(sys, '_getframe'):
    currentframe = sys._getframe
else:
    currentframe = lambda _=None: None

所以本质上inspect.currentframe方法等同于sys._getframe方法

> currentframe = lambda _=None: None 等同于 currentframe = lambda _: None ,即lambda函数接收一个参数,返回None


念念不忘,必有回响,小伙伴们帮我点个赞吧,非常感谢。

> 我是职场亮哥,YY高级软件工程师、四年工作经验,拒绝咸鱼争当龙头的斜杠程序员。
>
> 听我说,进步多,程序人生一把梭
>
> 如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个鼓励,将不胜感激。

本人所有文章、回答都与版权保护平台有合作,著作权归职场亮哥所有,未经授权,转载必究!

點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費專欄免費學(xué)

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消