Table of Contents

Python

문자열 처리 str / repr

꼬꼬마코더 2024. 4. 21. 23:51
728x90

Python에서 __str__과 __repr__는 객체를 문자열로 표현하기 위한 두 가지 매직 메서드입니다. 이 두 메서드는 유사한 기능을 하지만, 사용 목적과 결과에 차이가 있습니다.

__str__

  • 목적: __str__ 메서드는 객체를 인간이 읽기 쉬운 형태로 "비공식적인" 문자열 표현으로 변환하는 데 사용됩니다. 이 메서드는 str() 함수가 호출될 때 실행되며, print() 함수에서 객체를 출력할 때 자동으로 사용됩니다.
  • 사용자 친화적: 주로 사용자에게 친숙하고 이해하기 쉬운 형식으로 객체를 표시하는 데 중점을 둡니다.

__repr__

  • 목적: __repr__ 메서드는 객체를 "공식적인" 문자열 표현으로 변환하는 데 사용됩니다. 이 메서드는 객체를 개발자가 이해할 수 있는 방식으로 정확하게 표현하며, 가능한 경우, 이 문자열을 사용해 해당 객체를 재생성할 수 있어야 합니다 (eval(repr(obj)) == obj이 참이 되도록).
  • 개발자 친화적: 주로 디버깅과 개발 중에 객체의 정확한 상태를 문자열로 확인하기 위해 사용됩니다.

 

 

 

 

예시: 사용자 정의 클래스와 repr()

다음은 사용자 정의 클래스 Point에 대해 __repr__ 메소드를 구현한 예입니다. 이 클래스는 2차원 공간에서 점을 표현하며, __repr__ 메소드는 이 점의 좌표를 정확하고 명확하게 표현하기 위해 사용됩니다.

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Point({self.x}, {self.y})"

# 객체 생성
p = Point(3, 4)

# 객체의 repr() 출력
print(repr(p))  # 출력: Point(3, 4)

 

이 예에서 __repr__ 메소드는 객체를 생성하는 데 사용할 수 있는 정확한 문자열 표현을 제공합니다. repr(p)를 호출하면 Point(3, 4)라는 문자열이 반환되는데, 이는 Python의 생성자 호출 형식을 따릅니다. 이 문자열을 eval() 함수와 함께 사용하면 원래의 Point 객체를 정확히 재생성할 수 있습니다(단, 안전성을 고려하여 실제로 eval() 사용을 권장하지는 않습니다).

 

디버깅과 로깅

repr()은 디버깅과 로깅에 유용하게 사용됩니다. 객체의 상태를 정확히 알고 싶을 때, repr()으로 해당 객체의 상세 정보를 로그로 남길 수 있습니다. 이 정보를 통해 개발자는 코드의 행동을 더 잘 이해하고 문제를 더 쉽게 해결할 수 있습니다.

import logging

logging.basicConfig(level=logging.DEBUG)
logging.debug(repr(p))

 

 

이 로깅 예에서는 Point 객체의 repr() 결과가 로그로 기록되어, 개발자가 시스템의 상태를 확인하거나 문제를 진단하는 데 도움이 됩니다.