你怎么能在Python中打印一个variables名?

假设我有一个名为choice的variables,它等于2.我将如何访问variables的名称? 相当于的东西

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

用于制作字典。 有一个很好的方法来做到这一点,我只是想念它。

编辑:

这样做的原因是这样的。 我正在运行一些数据分析的东西,我调用的程序有多个参数,我想调整,或不调整,在运行时。 我从最后一次运行的.config文件格式化成的参数中读取参数

 filename no_sig_resonance.dat mass_peak 700 choice 1,2,3 

当提示input值时,显示先前使用的值,空stringinput将使用先前使用的值。

我的问题出现了,因为当编写字典时,这些值已被扫描到。 如果需要参数,我运行get_param来访问文件并find参数。

我想我会一起通过阅读来避免这个问题。 config文件一次,并从中产生一个字典。 我避免了原来的原因,我不再记得。 完美的情况下更新我的代码!

如果你坚持,这是一个可怕的基于检查的解决scheme。

 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已经指出的那样 ,可能有更好的方法来做到这一点。

你不能,因为在Python中没有variables,只有名字。

例如:

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

哪两个现在是正确的variables? ab之间没有区别。

之前也有类似的问题 。

如果你想这样做,这意味着你做错了什么。 考虑使用一个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 

我build议不要要求具体解决scheme的细节,而是要描述你所面对的问题。 我想你会得到更好的答案。 我这样说,因为几乎可以肯定有更好的方法去做任何你想做的事情。 以这种方式访问​​variables名通常不需要解决任何语言的问题。

也就是说,你所有的variables名已经存在于字典中,可以通过内置函数locals和globals来访问 。 使用正确的一个你正在检查的范围。

检查这些字典的几个常见成语之一是简单的string插值:

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

即使需要按名称检查variables,这种事情往往比替代scheme更具可读性。

会有这样的事情为你工作吗?

 >>> 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} 

对于如何读取configuration参数的修改问题,我强烈build议您节省一些时间和精力,并使用ConfigParser或(我的首选工具) ConfigObj 。

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

随着热切的评价,variables本质上变成了他们的价值,任何时候你看他们(释义)。 也就是说,Python确实有内置的命名空间 。 例如,locals()将返回一个将函数的variables名称映射到它们的值的字典,而globals()对模块也是这样。 从而:

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

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

另外,如果一个值有多个别名,遍历一个名字空间只能find第一个。