在函数中使用python inspect模块,我想获得调用该函数的行的源代码.

因此,在以下情况下:

def fct1():
    # Retrieve the line that called me and extract 'a'
    return an object containing name='a'

a = fct1()

我想检索fct1中的字符串"a=fct1()"

到目前为止,我所能做的就是使用以下工具检索整个模块的代码:

code = inspect.getsource(sys._getframe().f_back)

请注意,fct1()可以在主模块中多次调用.

最后,我想要的是检索变量名"a",如果我能在fct1()中得到s="a=fct1()",这很容易:

a_name = s.split("=")[0].strip()

推荐答案

一个真正愚蠢的解决方案是捕获堆栈跟踪并执行第二行:

import traceback

def fct1():
    stack = traceback.extract_stack(limit=2)
    print(traceback.format_list(stack)[0].split('\n')[1].strip())  # prints "a = fct1()"
    return None

a = fct1()

@jtlz2是在装饰师那里要求的

import traceback

def add_caller(func):
    def wrapper(*args, **kwargs):
        stack = traceback.extract_stack(limit=2)
        func(*args, caller=traceback.format_list(stack)[0].split('\n')[1].strip(), **kwargs)
    return wrapper

@add_caller
def fct1(caller):
    print(caller)

fct1()

它确实有效

Python相关问答推荐

如何使用OpenGL使球体遵循Python中的八样路径?

用两个字符串构建回文

如何获得满足掩码条件的第一行的索引?

来自Airflow Connection的额外参数

按条件计算将记录拆分成两条记录

为什么我的scipy.optimize.minimize(method=";newton-cg";)函数停留在局部最大值上?

将像素信息写入文件并读取该文件

如何在Polars中创建条件增量列?

解析CSV文件以将详细信息添加到XML文件

大Pandas 中的群体交叉融合

Pandas:根据相邻行之间的差异过滤数据帧

是否将列表分割为2?

将.exe文件从.py转换后出现问题.";ModuleNotFoundError:没有名为';Selify;的模块

捕获脚本和退出代码的多行输出

在动态创建带有图像的按钮时遇到问题

如何在Ubuntu上更新ChromeDriver二进制文件

已超过url:/Forecast的最大重试次数.无法在Fastapi应用程序上建立新连接:[WinError 10061]

NetCDF:使用MSWEP再分析数据集计算沿所有坐标的年降水量总和

基于时间间隔扩展Pandas DataFrame中的行,考虑可选中断

获取以极轴表示的最小/最大列名