프레임 객체에서 실행 스택의 기능 개체에 대한 참조를 얻습니까?

StackOverflow https://stackoverflow.com/questions/1034688

  •  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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top