본문 바로가기
IT 기술/프로그래밍관련

[Python] str() 과 repr() 의 차이

by 땅뚱 2014. 6. 17.

파이썬 공부를 시작했다.

숫자를 문자열로 변환시키는 함수를 보면서 궁금한 점이 생겼다.

 

숫자를 문자열로 변환하는 함수는 str과 repr 이다. str 은 print 문에 의한 출력과 동일한 문자열을 생성해 내고, repr은 변수만 입력해서 17자리 유효 자리를 출력하는 것과 같은 결과를 얻는다

 

>>> f = 1.23456789123456789

>>> str(f)

'1.23456789123'

>>> repr(f)

'1.23456789123456789'

 

왜 두가지를 나눠 놨을까 궁금했는데,회사 동료가 아래 링크를 보내주었다.

 

http://satyajit.ranjeev.in/2012/03/14/python-repr-str.html

 

요약해보면, repr() 은 __repr__ 메소드를 호출하고, str() 이나 print 는 __str__ 메소드를 호출하도록 되어있는데, __str__ 은 객체의 비공식적인(informal) 문자열을 출력할 때 사용하고, __repr__ 은 공식적인(official) 문자열을 출력할 때 사용한다.

 

쉽게 말하면 __str__ 은 사용자가 보기 쉬운 형태로 보여줄 때 사용하는 것이고, __repr__ 은 시스템(python interpreter)이 해당 객체를 인식할 수 있는 공식적인 문자열로 나타내 줄 때 사용하는 것이다.

 

그래서 eval(repr(object)) 를 하게 되면 해당 object 를 얻어올 수 있다. eval 은 파라미터로 들어온 string 을 Python expression 으로 간주하여 parsing 하고 계산하는 builtin 함수이다. 즉 공식적인 문자열이란 의미는 해당 문자열에 eval 함수를 실행시키면 해당 객체를 얻어올 수 있는 것을 말한다.

 

즉 위의 실수 변수인 f 를 예로 들면, 실수변수의 경우 유효값이 소수점 17자리이기 때문에 repr 로 출력할 경우 해당 실수객체를 완전하게 표현할 수 있는 값을 출력해주고 있고, str 의 경우는 사용자가 보기 편한 수준에서 보여주는 정도만 구현되어있다.

eval(repr(f)) 를 하는 경우 리턴값은 f 를 나타내는 스트링을 표현한 식을 다시 객체로 만들어준다. 아래 결과를 보면, eval 은 repr 을 사용하여 문자열로 변경된 객체를 새로 생성해준다는 것을 알 수 있다. 즉 f 와 g 의 값은 같으나, f와 g 가 가리키는 객체는 다르게 된다.

 

>>> f = 1.12345678901234567

>>> id(f)

36252424

>>> g = eval(repr(f))

>>> id(g)

46032032

>>> f is g

False

>>> f == g

True

 

__repr__ 이 구현되어있고, __str__ 이 구현되어있지 않은 경우에는 repr 과 str 은 동일한 결과를 나타낸다. 참고로 python document 사이트에 설명된 내용은 아래와 같다.

 

참조링크: https://docs.python.org/2/reference/datamodel.html#object.__repr__

 

object.__repr__(self)

Called by the repr() built-in function and by string conversions (reverse quotes) to compute the “official” string representation of an object. If at all possible, this should look like a valid Python expression that could be used to recreate an object with the same value (given an appropriate environment). If this is not possible, a string of the form

<...some useful description...>

should be returned. The return value must be a string object. If a class defines __repr__() but not __str__(), then __repr__() is also used when an “informal” string representation of instances of that class is required.

This is typically used for debugging, so it is important that the representation is information-rich and unambiguous.

object.__str__(self)

Called by the str() built-in function and by the print statement to compute the “informal” string representation of an object. This differs from __repr__() in that it does not have to be a valid Python expression: a more convenient or concise representation may be used instead. The return value must be a string object.