파이썬 공부를 시작했다.
숫자를 문자열로 변환시키는 함수를 보면서 궁금한 점이 생겼다.
숫자를 문자열로 변환하는 함수는 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.
'IT 기술 > 프로그래밍관련' 카테고리의 다른 글
[Python] if __name__ == "__main__": 의미 (14) | 2014.09.17 |
---|---|
[python] snakefood : module dependency check (0) | 2014.06.25 |
[bash] script debugging (0) | 2013.10.11 |
[bash] 5th - Trap Statement (0) | 2013.08.01 |
[linux] openat / open 의 차이점 (0) | 2012.12.28 |