기본 콘텐츠로 건너뛰기

라벨이 write인 게시물 표시

One Line, Two Writes: When pprint Breaks

`stream.write` 한 줄이 만든 차이: pprint가 커스텀 스트림에서 깨지는 이유를 고친 PR #145894 meta_description: pprint.PrettyPrinter가 frozendict를 출력할 때 write = stream.write 를 캐시해놓고도 다시 stream.write(...) 를 호출하던 실수를 PR #145894가 고쳤다. 출력은 단순하다는 가정이 깨지는 순간(래퍼/프록시/테스트 스트림)에서 어떤 증상이 생기는지, 내 코드에서 어떻게 빨리 재현·방어할지 정리한다. meta_keywords: pprint, PrettyPrinter, stream, write, frozendict, CPython, PR145894, GH145887, logging, proxy, wrapper, io, StringIO, TextIOBase, monkeypatch, regression, 테스트, 출력, 버그, 파이썬 meta_robots: index,follow 로그나 리포트 출력은 보통 그냥 문자열 찍는 것으로 취급된다. 그래서 더 골치 아프다. 출력이 깨지면 대개 기능이 멈추는 게 아니라, 디버깅이 멈춘다. 이번 CPython PR #145894는 그 전형적인 케이스다. 바뀐 건 한 줄인데, 가끔만 깨지는 출력 버그를 없앤다. PR이 바꾼 건 한 줄이다: write = stream.write 를 해놓고 왜 다시 stream.write 를 불렀나 PR #145894가 건드린 곳은 pprint.PrettyPrinter._pprint_frozendict() 다. diff를 보면 함수 시작에서 이렇게 한다. write = stream.write 이건 흔한 패턴이다. stream.write 를 로컬 변수로 잡아두면(lookup/cache) 그 아래에서 호출이 조금 싸지고 커스텀 스트림이 들어와도 write라는 기능만 있으면 된다는 의도를 코드에 남긴다 그런데 버그는 이런 식으로 생긴다....