文章目录
  1. 1. 使用sys._getframe方法
  2. 2. 使用inspect.stack方法
  3. 3. 完整代码

在Python中,获取调用者信息对于调试、打印日志等非常有帮助,本文将介绍获取调用者信息的两种方法。

使用sys._getframe方法

1
2
3
4
5
6
7
8
9
10
11
import sys

def print_caller_by_sys():
# 获取被调用函数所在模块文件名
print(sys._getframe(1).f_code.co_filename)

# 获取被调用函数名称
print(sys._getframe(1).f_code.co_name)

# 获取被调用函数在被调用时所处代码行数
print(sys._getframe(1).f_lineno)

使用inspect.stack方法

1
2
3
4
5
6
7
8
9
10
11
import inspect

def print_caller_by_inspect():
# 获取被调用函数所在模块文件名
print(inspect.stack()[1][1])

# 获取被调用函数名称
print(inspect.stack()[1][3])

# 获取被调用函数在被调用时所处代码行数
print(inspect.stack()[1][2])

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/env python
#coding:utf-8

import sys
import inspect

def print_caller_by_sys():
# 获取被调用函数所在模块文件名
print(sys._getframe(1).f_code.co_filename)

# 获取被调用函数名称
print(sys._getframe(1).f_code.co_name)

# 获取被调用函数在被调用时所处代码行数
print(sys._getframe(1).f_lineno)

def print_caller_by_inspect():
# 获取被调用函数所在模块文件名
print(inspect.stack()[1][1])

# 获取被调用函数名称
print(inspect.stack()[1][3])

# 获取被调用函数在被调用时所处代码行数
print(inspect.stack()[1][2])

# 定义为注解,方便调试具体函数
def show_caller(level=1):
def show(func):
def wrapper(*args, **kwargs):
func(*args, **kwargs)
print('{0.f_code.co_filename}:{0.f_code.co_name}:{0.f_lineno}'.format(sys._getframe(level)))
return wrapper
return show

@show_caller(1)
def main():
print_caller_by_sys()
print_caller_by_inspect()

if __name__ == '__main__':
main()
文章目录
  1. 1. 使用sys._getframe方法
  2. 2. 使用inspect.stack方法
  3. 3. 完整代码