需求:
程序运行过程中,要把某个功能调用的函数,函数中的代码,以及注释说明记录下来输出到log中,有什么内置模块或者第三方模块可以实现呢?
网上查找了以下,找到了想要的答案,记录下来方便日后查看
思路:
1、用inspect模块
2、用sys._getframe模块
先说下sys._getframe模块的用法:
用该模块主要是查看函数被什么函数调用以及被第几行调用及被调用函数所在文件
import sys
def get_cur_info():
print(sys._getframe().f_code.co_filename) # 当前文件名,可以通过__file__获得
print(sys._getframe(0).f_code.co_name) # 当前函数名
print(sys._getframe(1).f_code.co_name) # 调用该函数的函数名字,如果没有被调用,则返回<module>
print(sys._getframe(0).f_lineno) #当前函数的行号
print(sys._getframe(1).f_lineno) # 调用该函数的行号
生产环境可以将print用logging模块代替
再说下inspect模块的用法:
inspect 模块提供了一些有用的函数帮助获取对象的信息,例如模块、类、方法、函数、回溯、帧对象以及代码对象。
深度学习了解可以查看官方文档:https://docs.python.org/zh-cn/3.7/library/inspect.html
import inspect
def debug():
callnamer = inspect.stack()
print('[debug] enter: {}'.format(callnamer))
debug()
># 返回一个列表
> [debug] enter:
> [
> FrameInfo(frame=<frame object at 0x000000000096D448>,
> filename='E:/pythontest/sort.py', lineno=6, function='debug',
> code_context=[' callnamer = inspect.stack()\n'], index=0),
> FrameInfo(frame=<frame object at 0x00000000008F8828>, filename='E:/pythontest/sort.py',lineno=9,function='<module>',
> code_context=['debug()\n'], index=0)
> ]
> #选取列表的第二项
> import inspect
>
> def debug():
> callnamer = inspect.stack()[1]
> print('[debug] enter: {}'.format(callnamer))
>
> debug()
>
> [debug] enter:
> FrameInfo(frame=<frame object at 0x00000000004A8828>, filename='E:/pythontest/sort.py',
> lineno=9, function='<module>', code_context=['debug()\n'], index=0
> )
>
> # 选取函数的名字
>
> import inspect
>
> def debug():
> callnamer = inspect.stack()[1][4]
> print('[debug] enter: {}'.format(callnamer))
debug()
> [debug] enter: ['debug()\n']
inspect模块还提供了来自命令行的基本自省功能。
默认情况下,接受模块的名称并打印该模块的源代码。模块中的类或函数可以通过附加冒号和目标对象的限定名称来打印。
–details¶
打印有关指定对象的信息而不是源代码
更多信息可参考:
http://stackoverflow.com/questions/11799290/get-function-callers-information-in-python