关于字典:如何在python中打印变量名?

How can you print a variable name in python?

本问题已经有最佳答案,请猛点这里访问。

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

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

用于制作字典。有一个很好的方法可以做到这一点,我只是错过了。

编辑:

这样做的原因是。我正在运行一些数据分析工具,在那里我用多个参数调用程序,我想在运行时调整或不调整这些参数。我从格式为的.config文件中读取上次运行时使用的参数

1
2
3
4
5
6
7
8
filename
no_sig_resonance.dat

mass_peak
700

choice
1,2,3

当提示输入值时,将显示以前使用的值,空字符串输入将使用以前使用的值。

我的问题来了,因为当涉及到编写字典时,这些值已经被扫描到了其中。如果需要参数,我运行get_param,它访问文件并找到参数。

我想我会一起通过读一次.config文件并从中生成字典来避免这个问题。我本来是为了…我不记得的原因。完美的情况更新我的代码!


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

1
2
3
4
5
6
7
8
9
10
11
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)

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


要回答原始问题:

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

例子:

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

正如@rbright已经指出的那样,无论你做什么,都有更好的方法。


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

例如:

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

这两个变量中哪一个现在是正确的变量?ab没有区别。

以前也有类似的问题。


如果你想这样做,那就意味着你做了错事。考虑改用dict

1
2
3
4
5
def show_val(vals, name):
    print"Name:", name,"val:", vals[name]

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

输出:

1
Name: b val: 2


我建议你描述一下你面临的问题,而不是具体的解决方案,我认为你会得到更好的答案。我这么说是因为几乎可以肯定,无论你想做什么,都有更好的方法。以这种方式访问变量名通常不需要解决任何语言中的问题。

也就是说,所有变量名都已经在字典中了,可以通过内置函数local和globals访问字典。对您正在检查的范围使用正确的范围。

检查这些字典的少数常见习惯用法之一是方便字符串插入:

1
2
3
4
>>> first = 'John'
>>> last = 'Doe'
>>> print '%(first)s %(last)s' % globals()
John Doe

尽管这类东西需要按名称检查变量,但它的可读性往往比其他选项要高一些。


对于如何读取配置参数的修订问题,我强烈建议您节省一些时间和精力,并使用configparser或(我的首选工具)configobj。

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


这样的东西对你有用吗?

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

在你的例子中:

1
2
3
4
5
6
7
8
9
>>> 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}


通过热切的评估,变量在任何时候看到它们的时候都会变成它们的值(释义)。也就是说,python确实有内置的名称空间。例如,locals()将返回一个字典,将函数的变量名映射到它们的值,而globals()对模块也是如此。因此:

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

请注意,您不需要导入任何内容就可以访问locals()和globals()。

此外,如果一个值有多个别名,则通过名称空间迭代只会找到第一个别名。