2010-06-08 60 views
2

我想知道是否有可能在所有的Python字符串化 变量ID /符号 - 也就是说,行为如下功能:任何方式来在Python中对变量id /符号进行字符串化?

>>> symbol = 'whatever' 
>>> symbol_name(symbol) 
'symbol' 

现在,它是很容易做到这一点上函数或类(如果是 直接引用的对象):

>>> def fn(): pass 
>>> fn.func_name 
'fn' 

但是我正在寻找能够在所有情况下,即使 间接对象引用作品的一般方法。我想过使用id(var) ,但没有运气。

有没有办法做到这一点?

+3

可能重复的[python,我可以打印原始的var名称吗?](http://stackoverflow.com/questions/544919/python-can-i-print-original-var-name) – Anycorn 2010-06-08 19:39:43

+0

我正在看在python26/Python/ceval.c中实际的NameError源代码显然是NameError获得符号名称的权利。 (正如我在下面指出的,symbol_name(non_existent)产生一个回溯,其中“NameError:name'non_existent'未定义”消息。)PyTuple_GetItem(和PyDict_GetItem)产生我想要的符号名称,但是我还没有找到一个接口它并将其展示给用户。所以除非别人证明我,否则这可能是不可能的。对于类的任何实例变量,可以通过覆盖__getattribute__和grep NameError来实现,但是。 – OTZ 2010-06-08 20:35:59

回答

0

“不可能”就是答案。

3

我不认为这是可能的。即使是功能,不是变量名:

>>> def fn(): pass 
... 
>>> fn.func_name 
'fn' 
>>> b=fn 
>>> b.func_name 
'fn' 
>>> del fn 
>>> b.func_name 
'fn' 
>>> b() 
>>> fn() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'fn' is not defined 
4

这里,我敢肯定,你可以把它变成一个更好的形式=)

def symbol_name(a): 
    for k,v in globals().items(): 
     if id(a)==id(v): return k 

更新:由于unbeli所指出的,如果您有:

a = [] 
b = a 

该函数将无法显示您正确的名称,因为id(a)== id(b)。

+0

>>> SYMBOL_NAME的(a) '一' >>> B = A >>> SYMBOL_NAME(B) '一' 糟糕 – unbeli 2010-06-08 19:43:27

+0

鉴于任何对象都可以有多个名称,不会告发”如果a是v:results.append(k)...(假设你把这个循环包装在一个实例中并返回“results”)。 – 2010-06-08 19:44:08

+0

但是,无论如何,好主意:) – unbeli 2010-06-08 19:44:18

相关问题