[파이썬] str과 repr

__str__

 

str(), format(), print()에 의해 호출되어 객체의 인쇄 가능한 비형식적(informal) 문자열 표현을 반환한다.

 

__repr__

 

repr()에 의해 호출되어 객체의 공식적(formal)인 문자열 표현을 반환한다.

개체를 다시 만드는 데 사용할 수 있는 유효한 파이썬 표현을 만든다.

 

class Ex:
    pass

b = Ex()
print(repr(b))
#<__main__.Ex object at 0x000001F366546B20>

 

따로 형태가 정의되지 않으면 클래스 이름과 변수가 있는 메모리 주소를 기본형으로 출력한다.

(By default, it prints the module the object it's from, the class name, and the hexadecimal representation of its location in memory)

 

 

name = 'KIM'

print(repr(name))
#'KIM'
print(str(name))
#KIM
print(eval(repr(name)))
#KIM
print(eval(str(name)))
#Exception has occurred: NameError
#name 'KIM' is not defined

 

name'KIM'이라는 문자열을 저장했다.

 

repr로 출력하면 따옴표로 감싸져 'KIM'으로 출력된다.

str로 출력하면 따옴표 없이 KIM만 출력된다.

eval()은 실행가능한 표현의 문자열을 인자로 사용하여 실행이 완료된 후 결과를 반환하는 함수이다.

 

evalrepr을 주면 내용이 출력되지만, str을 주면 NameError가 발생한다.

 

a = 'abc'
b = abc
#Exception has occurred: NameError
#name 'abc' is not defined

 

repr은 따옴표로 감싼 형태를 반환한다 했다.

따옴표로 감싼 형태를 사용하면 a라는 객체를 만들어낼 수 있다.

str가 반환한 따옴표가 없는 문자열 형태로는 새로운 객체를 만들 수 없다.

공식적이라는 말은 객체로 다시 사용할 수 있는 표현식이라는 뜻이다.

 


b = 3.141592
c = eval(repr(b))

print(b)
#3.141592
print(c)
#3.141592
print(id(b))
1934312784656
print(id(c))
1934310198320

 

b를 가지고 만든 객체 c를 보면 값은 같지만 새로운 객체가 만들어졌으므로 id값은 다르다. repr이 반환한 값이 객체로 다시 사용되었음을 보여준다.

 

만약 클래스가 __str__없이 __repr__만 정의한다면, __repr__은 비형식적인(informal) 문자열 표현이 요구될 때 사용되어 str의 역할을 대신한다.