假设我有一个名为choice
的变量,它等于2.我如何访问变量的名称?相当于
In [53]: namestr(choice)
Out[53]: 'choice'
用于制作字典。这是一个很好的方法,我只是错过了它。
编辑:
这样做的原因是。我正在运行一些数据分析的东西,我在程序中调用了多个参数,我想在运行时调整或不调整。我从一个.config文件中读取了我在上次运行时使用的参数
filename
no_sig_resonance.dat
mass_peak
700
choice
1,2,3
当提示输入值时,将显示先前使用的值,空字符串输入将使用先前使用的值。
我的问题是因为在写字典时已经扫描了这些值。如果需要参数,我运行get_param
访问文件并找到参数。
我想我会通过阅读。config
文件一次并从中生成一个字典来避免这个问题。我原本避免了这个......我不再记得的原因。更新我的代码的完美情况!
答案 0 :(得分:89)
如果你坚持,这里有一些可怕的基于检查的解决方案。
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 :(得分:57)
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无论你做什么,都可能有更好的方法。
答案 2 :(得分:14)
你不能,因为Python中没有变量,只有名称。
例如:
> a = [1,2,3]
> b = a
> a is b
True
这两个中的哪一个现在是正确的变量? a
和b
之间没有区别。
之前有similar question。
答案 3 :(得分:10)
如果你想这样做,那就意味着你做错了什么。请考虑使用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
答案 4 :(得分:7)
我建议您描述您遇到的问题,而不是向特定解决方案询问详细信息;我想你会得到更好的答案。我这样说是因为几乎可以肯定有更好的方法去做你正在做的事情。通常不需要以这种方式访问变量名来解决任何语言的问题。
也就是说,您的所有变量名都已存在于可通过内置函数locals和globals访问的字典中。使用正确的一个作为您正在检查的范围。
检查这些词典的少数常用习惯之一是简单的字符串插值:
>>> first = 'John'
>>> last = 'Doe'
>>> print '%(first)s %(last)s' % globals()
John Doe
这种东西往往比替代品更具可读性,即使它需要按名称检查变量。
答案 5 :(得分:2)
通过热切的评估,变量在你看到它们的时候基本上会变成它们的值(换句话说)。也就是说,Python确实内置了namespaces。例如,locals()将返回将函数的变量名称映射到其值的字典,而globals()将对模块执行相同的操作。因此:
for name, value in globals().items():
if value is unknown_variable:
... do something with name
请注意,您无需导入任何内容即可访问locals()和globals()。
此外,如果某个值有多个别名,则遍历命名空间只会找到第一个。
答案 6 :(得分: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}
答案 7 :(得分:2)
对于如何阅读配置参数的修订问题,我强烈建议您节省一些时间和精力,并使用ConfigParser或(我的首选工具)ConfigObj。
他们可以做你需要的一切,他们很容易使用,而其他人已经担心如何让他们正常工作!