如何在 python 中打印变量名?

假设我有一个名为 choice的变量,它等于2。如何访问变量的名称?相当于

In [53]: namestr(choice)
Out[53]: 'choice'

有一个很好的方法可以做到这一点,但是我正在错过它。

编辑:

这样做的原因是这样的。我正在运行一些数据分析的东西,我调用的程序有多个参数,我想调整,或不调整,在运行时。类中的上一次运行中使用的参数。配置文件格式为

filename
no_sig_resonance.dat


mass_peak
700


choice
1,2,3

When prompted for values, the previously used is displayed and an empty string input will use the previously used value.

我提出这个问题是因为在编写字典的时候,这些值已经被扫描进去了。如果需要一个参数,我运行 get_param访问文件并找到参数。

我想通过阅读。一次生成 config文件并从中生成字典。我最初避免这样做是因为... 我已经不记得原因了。这是更新代码的最佳时机!

256878 次浏览

不能,因为在 Python 中没有变量,只有名称。

例如:

> a = [1,2,3]
> b = a
> a is b
True

这两个变量中哪个是正确的? ab之间没有区别。

以前也出现过 类似的问题

With eager evaluation, variables essentially turn into their values any time you look at them (to paraphrase). That said, Python does have built-in 命名空间. For example, locals() will return a dictionary mapping a function's variables' names to their values, and globals() does the same for a module. Thus:

for name, value in globals().items():
if value is unknown_variable:
... do something with name

请注意,您不需要导入任何东西来访问 local ()和 globals ()。

另外,如果一个值有多个别名,那么遍历一个名称空间只能找到第一个别名。

与其向具体的解决方案询问细节,我建议你描述你所面临的问题; 我认为你会得到更好的答案。我这么说是因为几乎可以肯定有更好的方法去做你想做的事情。在任何语言中,通常都不需要以这种方式访问变量名来解决问题。

也就是说,所有的变量名都已经在可以通过内置函数 当地人全球化访问的字典中了。对于您正在检查的范围,请使用正确的。

为数不多的检查这些词典的常用习惯用法之一是简单的字符串插值:

>>> first = 'John'
>>> last = 'Doe'
>>> print '%(first)s %(last)s' % globals()
John Doe

这种方法比其他方法更具可读性,尽管它需要按名称检查变量。

如果你正在尝试这样做,这意味着你正在做一些错误的事情。考虑使用 dict代替。

def show_val(vals, name):
print "Name:", name, "val:", vals[name]


vals = {'a': 1, 'b': 2}
show_val(vals, 'b')

产出:

Name: b val: 2

这样的方法对你有用吗?

>>> def namestr(**kwargs):
...     for k,v in kwargs.items():
...       print "%s = %s" % (k, repr(v))
...
>>> namestr(a=1, b=2)
a = 1
b = 2

在你的例子中:

>>> choice = {'key': 24; 'data': None}
>>> namestr(choice=choice)
choice = {'data': None, 'key': 24}
>>> printvars(**globals())
__builtins__ = <module '__builtin__' (built-in)>
__name__ = '__main__'
__doc__ = None
namestr = <function namestr at 0xb7d8ec34>
choice = {'data': None, 'key': 24}

如果你坚持,这里有一些可怕的基于检查的解决方案。

import inspect, re


def varname(p):
for line in inspect.getframeinfo(inspect.currentframe().f_back)[3]:
m = re.search(r'\bvarname\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)', line)
if m:
return m.group(1)


if __name__ == '__main__':
spam = 42
print varname(spam)

我希望它能激励你重新评估你所面临的问题,并寻找另一种解决方法。

回答你最初的问题:

def namestr(obj, namespace):
return [name for name in namespace if namespace[name] is obj]

例如:

>>> a = 'some var'
>>> namestr(a, globals())
['a']

作为 @rbright already pointed out,无论你做什么,可能有更好的方法来做到这一点。

对于如何读取配置参数的修订问题,我强烈建议您节省一些时间和精力,并使用 ConfigParser或(我喜欢的工具) 配置目标

他们可以做你需要的一切,他们很容易使用,并已经有人担心如何让他们正常工作!