我需要打印变量名,所以我做了:
def get_variable_name(x):
local_matches = [k for k, v in locals().items() if v is x]
global_matches = [k for k, v in globals().items() if v is x]
print(local_matches, global_matches)
return global_matches[0]
a = 5
print(get_variable_name(a))
# output
# (['x'], ['a'])
# a
这非常完美,但是现在我需要在项目的许多地方使用此get_variable_name
函数。因此,我将此函数移到了utils.py
,现在我们可以导入它并使用它了:
from scripts.utils import get_variable_name
a = 5
print(get_variable_name(a))
# output
# (['x'],[])
# ! can't access index 0 exception
# ! since the list is empty
很明显,在前一种方法中,在全局变量堆栈中发现了a,而在后者中则找不到,因为当它在执行该功能的utils.py
内时,globals()
不包含{{1} },因为它不在文件的全局范围内声明。
所以我们有a
给出了本地变量,locals().items()
给出了全局变量,如何访问文件间作用域变量堆栈?
更新:
在注释中提到的另一个SO question中,它们正在处理globals().items()
中全局范围内定义的变量,而在file1
中将不可用,因为{{1 }}仅导入file2
的模块。
但是在这里,我将这些变量发送到file1
,并且显然将其file2
的值发送给我,但是如何访问传递的参数名呢? (而且我没有看到与此相关的安全性或依赖性缺陷,因为它已经可以访问该变量,我只想要它们的名称)