2012-04-20 4 views
2

코드의 다른 위치에서 컨텍스트를 사용하여 기본적으로 늦게 eval을 수행하는 방법을 찾으려고합니다. 예를 들어, I 클래스 Friend을 가지고, 그것은 다음과 같이 사용할 수 있습니다코드의 다른 지점에서 전역에 액세스하는 방법

>>> class A: 
...  friend = Friend('B') 
... 
>>> class B: 
...  friend = Friend('A') 
... 
>>> A.friend.getobject() 
<class '__main__.B'> 

그러나, Friend은 별도의 라이브러리 코드의 다른 곳에서 정의되며,이 같은 보일 것이다 :

class Friend: 

    def __init__(self, objname): 
     self.objname = objname 

    def getobject(self): 
     return eval(self.objname, original_context) 

sqlalchemy ORM은 열 정의와 비슷한 패턴을 가지고 있지만 세션에서 소유하고있는 모든 클래스 (예 : 테이블)를 추적하여 구현합니다. 필요한 경우 비슷한 작업을 수행 할 수 있지만이 작업을 수행 할 수있는 다른 방법이 있는지 알고 싶습니다. 프레임과 인터프리터 스택을 살펴 봤는데, inspect.stack()[1][0].f_locals 같은 것을 사용하여 관련 프레임의 지역 주민들에게 접근 할 수 있다고 생각하지만, 객체가 정의되기 전에 호출되는 Frame.__init__에서이 작업을 수행해야합니다.

제 질문은 을 (를) 찾는 방법이지만 필요할 때만입니다. 여기에는 두 가지 문제가 있습니다. 1. Friend이 인스턴스화 된 환경 (또는 프레임?)에 액세스하는 방법. 2. 액세스 시점은 getobject입니다.

class A: 
    friend = Friend('themodule.B') 

그리고 그 문자열을, 모듈을 추출하고 B 클래스를 가져,이처럼 생성 :

답변

2

당신은 완전한 클래스 이름, 즉를 사용해야합니다.

그러나 일반적으로 더 좋은 방법이 할 수 있습니다 :이 경우 B에

class A: 
    friend = Friend(B) 

그 시점에서 정의되지 않은,하지만 당신은 쉽게 수행 할 수 있습니다

class A: 
    pass 

class B: 
    pass 

A.friend = Friend(B) 
B.friend = Friend(A) 
관련 문제