Python에서 %s와 %r의 차이점
%s 지정자는 객체를 str() 함수로 변환하여 출력하고, %r 지정자는 repr() 함수로 변환합니다.
정수처럼 일부 객체에서는 두 지정자가 동일한 결과를 반환하지만, repr()에는 특별한 기능이 있습니다. 가능한 타입에 한해 관례적으로 유효한 파이썬 문법 형태의 문자열을 반환하는데, 이 문자열은 해당 객체를 모호함 없이 다시 재현(recreate)할 수 있습니다.
예를 들어 개행 문자(\n)가 포함된 문자열이 있다고 가정해 보겠습니다. %s를 사용하면 실제로 줄바꿈이 적용되어 화면에 여러 줄로 출력되지만, %r을 사용하면 \n이 이스케이프 시퀀스 그대로 출력되며 따옴표도 함께 유지됩니다.
예제
>>> string = "Hello\nworld"
>>> print("Example: %s" % string)
Example: Hello
world
>>> print("Example: %r" % string)
Example: 'Hello\nworld'%r로 출력된 두 번째 표현식을 그대로 복사해서 실행하면 원래 객체를 정확히 재현할 수 있습니다. 이것이 바로 repr()의 핵심 역할입니다.
최신 파이썬에서의 활용 방법
파이썬 3에서는 f-string이나 str.format() 메서드에서도 동일한 규칙이 적용됩니다. f-string에서는 !r 변환 플래그를 사용해 repr() 출력 결과를 얻을 수 있습니다.
>>> string = "Hello\nworld"
>>> print(f"Example: {string!r}")
Example: 'Hello\nworld'
>>> print("Example: {!r}".format(string))
Example: 'Hello\nworld'언제 %r을 사용하는 것이 좋을까?
디버깅할 때 변수의 실제 값과 타입을 명확하게 확인하고 싶다면 %r 또는 {변수!r}을 사용하는 것이 좋습니다. 특히 공백이나 제어 문자가 포함된 문자열, 리스트·딕셔너리 같은 컨테이너 객체를 검사할 때 %r은 숨겨진 문자까지 그대로 보여주기 때문에 문제 원인을 파악하는 데 큰 도움이 됩니다.