How can you print a variable name in python?
假设我有一个名为
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 |
号
当提示输入值时,将显示以前使用的值,空字符串输入将使用以前使用的值。
我的问题来了,因为当涉及到编写字典时,这些值已经被扫描到了其中。如果需要参数,我运行
我想我会一起通过读一次.
如果你坚持,这里有一些可怕的基于检查的解决方案。
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 |
这两个变量中哪一个现在是正确的变量?
以前也有类似的问题。
如果你想这样做,那就意味着你做了错事。考虑改用
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()。
此外,如果一个值有多个别名,则通过名称空间迭代只会找到第一个别名。