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

파이썬 str() vs repr(): 차이점 완벽 정리

파이썬에서 str()repr()은 모두 객체를 문자열로 표현하기 위해 사용되는 메서드입니다. 두 함수는 같은 목적을 가진 것처럼 보이지만, 실제로는 중요한 차이점이 존재합니다.

파이썬 내장 함수인 str(x)를 호출했을 때 어떤 일이 일어나는지 생각해 본 적이 있으신가요? str(x)의 반환 값은 두 가지 메서드에 의해 결정됩니다. 기본적으로는 __str__이 우선 선택되며, 해당 메서드가 정의되어 있지 않으면 __repr__이 대체(fallback)로 사용됩니다.

공식 문서의 정의

먼저 파이썬 공식 문서에서 각 함수를 어떻게 설명하고 있는지 살펴보겠습니다.

>>> help(str)
Help on class str in module builtins:

class str(object)
|  str(object='') -> str
|  str(bytes_or_buffer[, encoding[, errors]]) -> str
|
|  Create a new string object from the given object.

>>> help(repr)
Help on built-in function repr in module builtins:

repr(obj, /)
    Return the canonical string representation of the object.

    For many object types, including most builtins,
    eval(repr(obj)) == obj.

예제로 확인하는 차이점

>>> str(123)
'123'
>>> repr(123)
'123'
>>> # 위 결과에서 정수 데이터에는 두 메서드 간 차이가 없음을 알 수 있습니다
>>> # 이제 문자열 데이터를 두 메서드에 적용해 보겠습니다
>>> str('Python')
'Python'
>>> repr('Python')
"'Python'"

정수 값에 대해서는 repr()str()의 반환 결과가 동일하지만, 문자열의 경우에는 차이가 있습니다. 하나는 격식 있는(formal) 표현이고, 다른 하나는 격식 없는(informal) 표현입니다.

공식 파이썬 문서에 따르면 __str__은 객체의 "비격식적인"(읽기 쉬운) 문자열 표현을 얻는 데 사용되고, __repr__은 객체의 "격식 있는" 문자열 표현을 얻는 데 사용됩니다.

두 표현 방식의 핵심적인 차이는 str 값에 대한 __repr__의 기본 구현이 eval 함수의 인자로 전달될 수 있으며, 그 결과로 유효한 문자열 객체가 반환된다는 점입니다. 즉, eval() 함수는 문자열을 받아 그 내용을 파이썬 코드로 해석하여 실행합니다.

따라서 "'Python'"을 eval에 전달하면 정상적으로 작동합니다. 반면 'Python'을 전달하면 오류가 발생하는데, 이는 Python이라는 이름이 정의되지 않은 변수로 해석되기 때문입니다. 아래 코드를 통해 확인해 보겠습니다.

>>> x = "Python"
>>> repr(x)
"'Python'"
>>> x1 = eval(repr(x))
>>> x == x1
True

반면 __str__의 반환 값을 eval의 인자로 사용하면 실패하게 됩니다.

>>> y = "Python"
>>> str(y)
'Python'
>>> y1 = eval(str(y))
Traceback (most recent call last):
File "<pyshell#51>", line 1, in <module>
y1 = eval(str(y))
File "<string>", line 1, in <module>
NameError: name 'Python' is not defined

datetime 객체로 보는 또 다른 예제

>>> import datetime
>>> now = datetime.datetime.now()
>>> str(now)
'2019-03-29 01:29:23.211924'
>>> repr(now)
'datetime.datetime(2019, 3, 29, 1, 29, 23, 211924)'

위 출력 결과에서 str(now)는 now 객체의 값을 담은 사람이 읽기 좋은 문자열을 생성하는 반면, repr(now)는 now 객체를 다시 만들기 위해 필요한 파이썬 코드를 그대로 반환합니다.

핵심 차이점 정리

str()
repr()
객체를 읽기 쉽게 만듦
객체를 재현할 수 있는 코드를 제공
최종 사용자를 위한 출력 생성
개발자를 위한 출력 생성

여러분의 클래스에 __str____repr__을 구현할 때는 위의 차이점을 반드시 고려해야 합니다. 디버깅과 로깅에는 repr()이, 화면에 정보를 보여줄 때는 str()이 적합합니다.