有没有办法在运行时知道变量的名称(来自代码)? 或者在编译期间忘记变量的名称(字节代码与否)?
e.g:
>>> vari = 15 >>> print vari.~~name~~() 'vari'
注意:我说的是纯数据类型变量(int
,str
,list
等。)
答案 0 :(得分:31)
变量名称不会被遗忘,您可以通过内省访问变量(并查看您拥有的变量),例如:
>>> i = 1
>>> locals()["i"]
1
但是,因为Python中没有指针,所以没有实际写入名称就无法引用变量。因此,如果您想要打印变量名称及其值,可以通过locals()
或类似函数。 ([i]
变为[1]
,并且无法检索1
实际来自i
的信息。)
答案 1 :(得分:10)
变量名仍然存在于已编译的代码中(例如dir
内置函数可以如何工作),但是那里的映射从名称到值,反之亦然。因此,如果有几个变量都值得,例如23
,则无法仅根据值23
将它们告诉彼此。
答案 2 :(得分:4)
这是我用来打印变量值的函数,它适用于局部和全局:
import sys
def print_var(var_name):
calling_frame = sys._getframe().f_back
var_val = calling_frame.f_locals.get(var_name, calling_frame.f_globals.get(var_name, None))
print (var_name+':', str(var_val))
以下代码:
global_var = 123
def some_func():
local_var = 456
print_var("global_var")
print_var("local_var")
print_var("some_func")
some_func()
产生
global_var: 123
local_var: 456
some_func: <function some_func at 0x10065b488>
答案 3 :(得分:3)
这适用于简单数据类型(str,int,float,list等)
def my_print(var_str) :
print var_str+':', globals()[var_str]
答案 4 :(得分:2)
你可以做到,它只是不漂亮。
import inspect, sys
def addVarToDict(d, variable):
lineNumber = inspect.currentframe().f_back.f_lineno
with open(sys.argv[0]) as f:
lines = f.read().split("\n")
line = lines[lineNumber-1]
varName = line.split("addVarToDict")[1].split("(")[1].split(",")[1].split(")")[0].strip()
d[varName] = variable
d = {}
a=1
print d # {}
addVarToDict(d,a)
print d # {'a': 1}
答案 5 :(得分:2)
这里有一个基本的(可能很奇怪的)函数,它显示了参数的名称...... 我的想法是分析代码并搜索对函数的调用(在 init 方法中添加它可以帮助找到实例名称,尽管代码分析更复杂)
def display(var):
import inspect, re
callingframe = inspect.currentframe().f_back
cntext = "".join(inspect.getframeinfo(callingframe, 5)[3]) #gets 5 lines
m = re.search("display\s+\(\s+(\w+)\s+\)", cntext, re.MULTILINE)
print m.group(1), type(var), var
请注意: 从调用代码中获取多行有助于以下示例中分割调用:
display(
my_var
)
但会产生意想不到的结果:
display(first_var)
display(second_var)
如果您无法控制项目的格式,您仍然可以改进代码以检测和管理不同的情况......
总的来说,我认为静态代码分析可以产生更可靠的结果,但我现在懒得检查它
答案 6 :(得分:1)
我在上面的帖子中尝试了以下链接但没有成功: 谷歌回复了这一个。
答案 7 :(得分:0)
就在昨天,我看到一篇博文,其中包含了正常工作的代码。这是链接:
http://pyside.blogspot.com/2009/05/finding-objects-names.html
答案 8 :(得分:-1)
使用 f 字符串格式的不错的简单解决方案,这是 Python 3.6 及更高版本的本机:
vari
产生:
interval(1000)