2010-06-08 3 views
2

는 파이썬이 변수 ID/기호를 캐릭터 라인 화하기 위해 모든 가능한 경우, 내가 궁금하네요 - 즉, 다음과 같이 동작하는 기능 :Python에서 변수 id/기호를 문자열로 변환하는 방법은 무엇입니까?

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

을 지금, 그것을 쉽게 할 수있다 함수 또는 클래스 (이 개체에 대한 직접 참조 인 경우) :

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

하지만 모든 경우에, 도 간접 객체 참조에서 작동하는 일반적인 방법을 찾고 있어요. 나는 어쨌든 id (var)를 사용했지만 아직 행운을 생각하지 못했습니다.

어떤 방법이 있습니까?

+3

[파이썬, 원본 고유 이름을 인쇄 할 수 있습니까?] (http://stackoverflow.com/questions/544919/python-can-i-print-original-var-name) – Anycorn

+0

내가보고있어 Python26/Python/ceval.c의 NameError의 실제 소스 코드는 분명히 NameError가 심볼 이름을 올바르게 가져옵니다. (아래에서 언급했듯이, symbol_name (non_existent)는 "NameError : name 'non_existent'not defined"메시지와 함께 traceback을 생성합니다.) PyTuple_GetItem (그리고 PyDict_GetItem)은 원하는 기호 이름을 생성하지만 랩핑하는 인터페이스를 찾지 못했습니다 그것을 사용자에게 보여줍니다. 누군가가 그렇지 않으면 나를 증명하지 않으면, 그것은 불가능할 수도 있습니다. 그러나 클래스의 인스턴스 변수에 대해서는 __getattribute__를 덮어 쓰고 NameError를 grepping하는 것이 가능합니다. – OTZ

답변

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) 'A' >>> B = A >>> symbol_name (b) 'A' 죄송 – unbeli

+0

물체가 여러 이름을 가질 수 있음을 감안할 때 같으면 ' t : this가 약간 더 좋다 : a가 v : results.append (k) ... 인 경우 (인스턴스화에서 루프를 감싸고 "결과"가 반환된다고 가정). –

+0

그래도 좋은 생각 이니 :) – unbeli

관련 문제