이 둘이 뭘 의미하는지에 대해선, 길고 지루하고 어려운 논의가 많다.
하지만, 그건 원론, 또는 학술의 관점에서 그렇다는 얘기고, 내 선에선 이렇게만 알면 되겠다.
‘이렇게’는 아래 코드로 대신한다.
코드는 Beyond the Basic stuff with Python 에서 가져왔다.
WizCoin 이라는 클래스를 만들고, 객체를 생성한 후, repr 과 str 로 확인해보자.
In [1]: class WizCoin: ...: def __init__(self, galleons, sickles, knuts): ...: """Create a new WizCoin object with galleons, sickle,s and knuts.""" ...: self.galleons = galleons ...: self.sickles = sickles ...: self.knuts = knuts ...: In [2]: foo = WizCoin(3,6,9) In [3]: repr(foo) Out[3]: '<__main__.WizCoin object at 0x7f3b9f674400>' In [4]: str(foo) Out[4]: '<__main__.WizCoin object at 0x7f3b9f674400>'
뭔가 설명이 나오긴 하지만, 객체가 메모리에 존재하고 있다는, 아주 ‘공무원’스러운 설명 뿐, 이게 뭔지는 알 수가 없다.
이렇게 객체에 대한 정보가 필요할 때, repr 과 str 을 사용한다.
이번엔 datetime.timedelta
라는 객체를 살펴본다.
In [1]: import datetime In [2]: bar = datetime.timedelta(days=7, hours=13, minutes=21) In [3]: repr(bar) Out[3]: 'datetime.timedelta(days=7, seconds=48060)' In [4]: str(bar) Out[4]: '7 days, 13:21:00'
datetime.timedelta(days=7, hours=13, minutes=21)
라고 정의한 객체에 대해 repr 과 str 의 결과가 다르게 나왔다. 퉁명스럽게 메모리 주소만 알려주던 방식이 아니고, 이게 뭔지에 대해 자세한(?) 설명을 볼 수 있다.
이제 정리하자면,
- repr : 프로그래머에게 필요한 객체의 정보/형식
- str : 일반 사용자에게 필요한 객체의 정보/형식
다시 WizCoin 으로 돌아가서, 여기에 repr/str 을 구현하려면, Dunder Method 를 쓰면 된다.
In [18]: class WizCoin: ...: def __init__(self, galleons, sickles, knuts): ...: """Create a new WizCoin object with galleons, sickle,s and knuts.""" ...: self.galleons = galleons ...: self.sickles = sickles ...: self.knuts = knuts ...: ...: def __repr__(self): ...: """Returns a stirng of an expression that re-creates this object.""" ...: return f'{self.__class__.__qualname__}({self.galleons}, {self.sickles}, {self.knuts})' ...: ...: def __str__(self): ...: """Returns a human-readable stirng representation of this object.""" ...: return f'{self.galleons}g, {self.sickles}s, {self.knuts}k' ...: In [19]: foo = WizCoin(3,6,9) In [21]: repr(foo) Out[21]: 'WizCoin(3, 6, 9)' In [22]: str(foo) Out[22]: '3g, 6s, 9k'
간단하지?