파이썬에는 프레임 추적을위한 휴대용 방법이 없지만 CPython 구현은 다음을 수행합니다. sys._getframe
은 프레임 객체를 반환합니다.
프레임 개체로 무엇을 할 수 있습니까? 프레임에 표시되는 locals()
및 globals()
과 프레임에서 실행되는 코드 객체 (로컬 이름, 언 바운드 이름 및 셀 포함)를 포함하는 모든 재미있는 것들에 대해서는 inspect
문서의 편리한 차트를 참조하십시오. 폐쇄.
그러나 다른 사람들이 지적했듯이이 프레임을 실제로 필요로하지는 않습니다. 당신이 필요로하는 것은 현지인 뿐이고 컨텍스트 관리자에게 명시 적으로 전달하는 것이 훨씬 간단합니다.당신이 정말로 이렇게 할 경우
: 실행하면
import contextlib
import sys
@contextlib.contextmanager
def dumping():
f = sys._getframe(2)
fl = f.f_locals.copy()
try:
yield None
finally:
for name, value in f.f_locals.items():
if name not in fl:
print('{} = {}'.format(name, value))
bar = 0
def foo():
global bar
bar = 3
baz = 4
qux = 5
with dumping():
spam = 'eggs'
eggs = 3
bar = 4
baz = 5
foo()
이 인쇄한다 : 즉
eggs = 3
spam = eggs
만 새 변수의 이름과 값을하는 with
블록 내에서 선언되었습니다. 내 생각에, 당신이 원했던 것입니까? 둘 다 새로운 리바운드 지역 주민을 원하는 경우에
, 당신은 아마 이런 식으로 뭔가 저장할 것 : 당신은 또한 nonlocals 및 전역을 바인딩 할 수 물론
fl = {(name, id(value)) for name, value in f.f_locals.items()}
을, 그래서 당신은 그것에 대해 걱정하는 경우 , 전역을 숨기거나 (모듈 레벨 코드의 경우 locals is globals
을 확인하십시오) 닫히거나 닫습니다.
당신이 CPython의 2를 사용하는 경우 (그 이유는 무엇입니까? 실제 프로젝트를 위해 가끔 의미가 있지만, 아직 내부는 재미를 위해 작동하는 방법입니까?하고, 어떤 사람들에 ...), 같은 코드가 작동합니다. 약간 다른 속성 이름이있을 수 있지만 프레임과 코드의 dir
을 버리면 추측 할 수 있습니다. 그리고 분명히 2.x print
구문을 원합니다.
PyPy에서도 2.0b 이상 작동합니다.
하는 당신은 내가 _getframe(2)
를 사용하여 어떻게 알았는지 궁금해하는 경우 ... 나는하지 않았다. 나는 그것이 1 또는 2 프레임 위로, 아마도 3 일 것이라고 확신했다. 그러나 어느 것이 든? 그래서 방금 이렇게했습니다.
@contextlib.contextmanager
def dumping():
for i in range(4):
f = sys._getframe(i)
print(f.f_code.co_filename, f.f_code.co_firstlineno, f.f_lineno)
0은 물론 dumping
입니다. 1은 contextlib.contextmanager
의 래퍼 함수입니다. 2는 호출 프레임입니다. 3은 모듈 최상위 레벨입니다. 일단 당신이 그것에 대해 생각하면 명백합니다. 그러나 그 대답을 알기 전까지는 분명하지 않았습니다. :)
"실행 중지"란 무엇을 의미합니까? 디버거는 스크립트의 실행을 멈출 수 있지만 스크립트가 실행을 중지하면 더 이상 실행되지 않으므로 아무 것도 할 수 없습니다. – abarnert
예, "중지 실행"은 단어의 매우 열악한 (그리고 부정확 한) 선택이었습니다. 제가 말하고자했던 것은 그 위치에 상대적으로 보이는 곳을 정하기위한 목적으로 "현재의 경계표"였습니다. –
OK, 네, 그게'sys._getframe()'이하는 일입니다. 프레임 객체를 나중에 저장하고 프레임 외부에서 사용할 수도 있습니다 (보통 나중에 GC를 정리할 순환 참조를 많이 만들지 만). 예를 들어'[in range (1)] [0] .f_code'에 대한'[sys._getframe()]은 CPython listcomps 안의 숨겨진 함수를 얻을 수있게 해주고, 더 깨끗한 방법으로는 생각할 수 없습니다. – abarnert