将函数赋值给变量后,如何在函数内部获取该变量的名称字符串?
能否在函数内部获取指向它的变量名?
不能直接通过原生机制获取到my_variable这类指向函数的变量名。
原因很简单:函数是一个独立的对象,变量只是指向这个对象的引用。一个函数可以被多个变量同时引用,甚至可以直接被调用(比如my_function()),函数本身没有内置信息记录自己是被哪个变量名触发调用的。
如果非要实现类似需求,有两种hack性质的方法,但都存在明显局限性:
1. 通过栈帧反向查找命名空间
借助inspect模块获取调用者的局部/全局变量,遍历查找值等于当前函数的变量名:
import inspect def my_function(): caller_frame = inspect.currentframe().f_back caller_vars = caller_frame.f_locals matched_names = [name for name, val in caller_vars.items() if val is my_function] print(matched_names) my_variable = my_function my_variable() # 输出 ['my_variable'] my_function() # 输出 ['my_function']
这种方法的问题:
- 如果有多个变量指向同一个函数,会返回所有匹配的名字
- 作用域复杂时(比如嵌套函数、类方法),查找结果可能不准确
- 依赖
inspect模块的内部机制,属于非标准实现,不适合生产环境
2. 调用时显式传递变量名
这是最可靠的方式,让调用方把变量名作为参数传给函数:
def my_function(caller_name=None): print(caller_name) my_variable = my_function my_variable(caller_name='my_variable') # 输出 my_variable
这种方法完全可控,没有歧义,但需要调用方主动配合传递参数。
内容的提问来源于stack exchange,提问作者Some Guy
相关产品推荐
相关产品推荐

