2010-06-08 61 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

相關問題