你怎么能在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? a
和b
之间没有区别。
之前也有类似的问题 。
如果你想这样做,这意味着你做错了什么。 考虑使用一个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第一个。