2010-06-08 1 views
2

мне интересно, если это вообще возможно в Python для stringify идентификатор переменной/символ - то есть функция, которая ведет себя следующим образом:Любой способ подстроить переменную id/symbol в Python?

>>> 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

+0

Я смотрю фактический исходный код NameError в python26/Python/ceval.c, так как очевидно, что NameError действительно получает имя символа. (Как я заметил ниже, symbol_name (non_existent) дает трассировку с сообщением «NameError: name» non_existent «не определено».) PyTuple_GetItem (и PyDict_GetItem) дает имя символа, которое я хочу, но я не нашел интерфейс, который обертывает он и показывает это пользователю. Поэтому, если кто-то не докажет меня иначе, это может быть невозможно. Однако для любой переменной экземпляра класса возможно переопределить __getattribute__ и grepping NameError. – OTZ

ответ

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 

функция не будет в состоянии показать вам правильное имя, так как идентификатор (а) == идентификатор (б).

+0

>>> symbol_name (а) 'а' >>> Ь = а >>> symbol_name (б) 'а' упс – unbeli

+0

Учитывая, что любой объект может иметь несколько имен, Wouldn» t это немного лучше: если a есть v: results.append (k) ... (предполагая, что вы завершаете цикл в экземпляре и возвращаете «результаты»). –

+0

но, хорошая идея в любом случае :) – unbeli

Смежные вопросы