Python如何从零实现可返回自身被调用行号的自定义函数?
Python无第三方依赖获取函数调用行号实现方案
完全可以实现,我们只需要用到Python标准库自带的inspect模块即可,不需要安装任何第三方依赖。
实现原理
Python的inspect.stack()方法会返回当前调用栈的帧列表,列表索引为0的元素是当前正在执行的函数自身的栈帧,索引为1的元素就是调用当前函数的上层栈帧,栈帧对象的lineno属性对应当前栈帧执行位置的代码行号。
代码实现
import inspect def get_caller_line() -> int: # 取调用栈的第1层,即调用当前函数的位置栈帧 caller_stack = inspect.stack()[1] line_num = caller_stack.lineno # 可选:手动释放栈帧避免内存占用 del caller_stack return line_num
测试用例
你可以用下面的代码测试功能是否符合预期:
def demo(): # 此处调用会返回下一行的行号 print(get_caller_line()) if __name__ == "__main__": demo() # 输出demo函数内部调用get_caller_line的行号 # 此处调用会返回下一行的行号 print(get_caller_line()) # 输出当前调用行的行号
注意事项
- 如果你需要获取更上层的调用链路行号,只需调整
inspect.stack()的索引即可,比如要获取调用者的上层调用行号,将索引改为2即可 - 手动删除用过的栈帧对象可以避免不必要的内存引用,简单场景下可以省略该步骤
- 该实现兼容所有Python 3.6及以上的主流版本
内容的提问来源于stack exchange,提问作者Tee Uno
相关产品推荐
相关产品推荐

