Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python str() vs repr(): 두 함수의 차이점과 올바른 사용법

파이썬 공식 문서에 따르면 __repr__은 객체의 '공식적인(official)' 문자열 표현을 반환하는 데 사용되고, __str__은 객체의 '비공식적인(informal)' 문자열 표현을 반환하는 데 사용됩니다. print 문과 str() 내장 함수는 객체를 출력할 때 __str__을 호출하며, repr() 내장 함수는 __repr__을 호출합니다.

str()과 repr()의 기본 동작 원리

두 메서드가 실제로 어떤 차이를 만드는지 예제를 통해 살펴보겠습니다. 먼저 datetime 객체를 하나 생성합니다.

>>> import datetime
>>> today = datetime.datetime.now()

str() 함수 사용 예시

내장 함수 str()을 사용해 today 객체를 문자열로 변환해 보겠습니다.

>>> str(today)
'2018-01-12 09:21:58.130922'

날짜가 사용자가 읽고 이해하기 쉬운 형태의 문자열로 표시되는 것을 확인할 수 있습니다. 이것이 바로 '비공식적인' 표현, 즉 사람 중심의 친화적인 출력 방식입니다.

repr() 함수 사용 예시

이번에는 내장 함수 repr()을 사용해 보겠습니다.

>>> repr(today)
'datetime.datetime(2018, 1, 12, 9, 21, 58, 130922)'

역시 문자열이 반환되었지만, 이 문자열은 datetime 객체의 '공식적인' 표현입니다. 여기서 중요한 점은 이 공식적인 문자열 표현만 있으면 원래 객체를 그대로 재구성(reconstruct)할 수 있다는 것입니다.

eval()로 객체 재구성하기

repr()이 반환한 문자열을 eval() 함수에 전달하면 동일한 datetime 객체가 다시 생성됩니다.

>>> eval('datetime.datetime(2018, 1, 12, 9, 21, 58, 130922)')
datetime.datetime(2018, 1, 12, 9, 21, 58, 130922)

eval() 내장 함수는 문자열을 입력받아 이를 실행 가능한 코드로 평가하고, 그 결과인 datetime 객체를 반환합니다. 이처럼 repr()의 출력은 디버깅과 로깅에 매우 유용하게 활용됩니다.

정리: 언제 어떤 메서드를 구현해야 할까?

일반적으로 직접 작성하는 모든 클래스에는 최소한 __repr__ 메서드를 구현하는 것이 권장됩니다. 그리고 datetime 예제에서 본 것처럼 객체를 사람이 읽기 쉬운 문자열 형태로 제공하는 것이 유용하다고 판단되면 __str__ 메서드도 함께 추가하면 됩니다. 참고로 __str__이 정의되어 있지 않으면 파이썬은 자동으로 __repr__을 대신 사용하므로, __repr__만 잘 구현해도 기본적인 출력은 보장됩니다.