코드의 다른 위치에서 컨텍스트를 사용하여 기본적으로 늦게 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 클래스를 가져,이처럼 생성 :