프레임 객체에서 실행 스택의 기능 개체에 대한 참조를 얻습니까?
-
06-07-2019 - |
문제
출력이 주어졌습니다 inspect.stack()
, 스택 프레임의 어느 곳에서나 기능 객체를 가져 와서 호출 할 수 있습니까? 그렇다면 어떻게?
(나는 이미 함수의 이름을 얻는 방법을 알고 있습니다.)
여기에 내가 얻는 것입니다. 내가 기능이라고 가정 해 봅시다. 발신자가 생성기인지 또는 일반 기능인지 판단하려고 노력하고 있습니까? 전화해야합니다 inspect.isgeneratorfunction()
함수 객체에서. 그리고 누가 당신을 불렀는지 어떻게 알아 내나요? inspect.stack()
, 오른쪽? 그래서 어떻게 든 그것들을 정리할 수 있다면, 나는 내 질문에 대한 답을 얻을 것이다. 아마도 더 쉬운 방법이 있습니까?
해결책
다음은 코드 스 니펫이 있습니다. 오류 확인이 없습니다. 아이디어는 그랜드 부모의 현지인들에게 호출 된 기능 객체를 찾는 것입니다. 반환 된 기능 객체는 부모 여야합니다. 빌드 딘을 검색하려면 스택을 살펴보십시오 [2] [0] .f_builtins.
def f():
stacks = inspect.stack()
grand_parent_locals = stacks[2][0].f_locals
caller_name = stacks[1][3]
candidate = grand_parent_locals[caller_name]
수업의 경우 다음을 쓸 수 있습니다 (Marcin 솔루션에서 영감을 얻음).
class test(object):
def f(self):
stack = inspect.stack()
parent_func_name = stack[1][3]
parent_func = getattr(self, parent_func_name).im_func
다른 팁
나는 Eolmar의 대답과 매우 유사한 다음 접근법을 취했습니다.
stack = inspect.stack()
parent_locals = stack[1][0].f_locals['self']
parent_func_name = stack[1][3]
parent_func_attr = getattr(parent_locals,parent_func_name)
parent_func = parent_func_attr.im_func
is_parent_gen = inspect.isgeneratorfunction(func)
제휴하지 않습니다 StackOverflow