Python : repr 과 str. 간단 정리.

이 둘이 뭘 의미하는지에 대해선, 길고 지루하고 어려운 논의가 많다.
하지만, 그건 원론, 또는 학술의 관점에서 그렇다는 얘기고, 내 선에선 이렇게만 알면 되겠다.

‘이렇게’는 아래 코드로 대신한다.


코드는 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'

간단하지?

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.