reprlib — 대체 repr() 구현

reprlib — 대체 repr() 구현

reprlib 모듈은 결과 문자열의 크기에 제한을 두고 객체 표현을 생성하는 수단을 제공해요. 이것은 파이썬 디버거에서 사용되며 다른 문맥에서도 유용할 수 있어요. 크기가 커서 위험한 객체 표현이 무한정 자라거나 너무 길어지는 걸 막아 주는 게 핵심이에요.

출처: Python documentation

본문

이 모듈은 클래스, 인스턴스, 함수 하나를 제공해요.

  • class reprlib.Repr(, maxlevel=6, maxtuple=6, maxlist=6, maxarray=5, maxdict=4, maxset=6, maxfrozenset=6, maxdeque=6, maxstring=30, maxlong=40, maxother=30, fillvalue='...', indent=None)* — 내장 repr() 과 비슷한 함수를 구현하는 데 유용한 포맷팅 서비스를 제공하는 클래스예요. 지나치게 긴 표현 생성이 생기지 않도록 서로 다른 객체 타입에 크기 제한이 추가됐어요.

    • 생성자의 키워드 인자는 Repr 인스턴스의 속성을 설정하는 단축키로 쓸 수 있어요. 즉 reprlib.Repr(maxlevel=3)aRepr = reprlib.Repr(); aRepr.maxlevel = 3 과 동등해요.
    • 버전 3.12에서 키워드 인자로 속성 설정을 허용하도록 변경됐어요.
  • reprlib.aRepr — 아래 설명된 repr() 함수를 제공하는 데 사용되는 Repr 인스턴스예요. 이 객체의 속성을 변경하면 repr() 과 파이썬 디버거가 사용하는 크기 제한이 달라져요.

  • reprlib.repr(obj)aReprrepr() 메서드예요. 같은 이름의 내장 함수가 반환하는 문자열과 비슷하지만 대부분 크기에 제한이 있는 문자열을 반환해요.

크기 제한 도구 외에도 이 모듈은 __repr__() 에 대한 재귀 호출을 감지하고 대신 플레이스홀더 문자열을 대입하는 데코레이터도 제공해요.

  • @reprlib.recursive_repr(fillvalue='...') — 같은 스레드 내의 재귀 호출을 감지하는 __repr__() 메서드용 데코레이터예요. 재귀 호출이 일어나면 fillvalue 를 반환하고, 아니면 보통의 __repr__() 호출을 해요. 버전 3.2 추가.
>>> from reprlib import recursive_repr
>>> class MyList(list):
...     @recursive_repr()
...     def __repr__(self):
...         return '<' + '|'.join(map(repr, self)) + '>'
...
>>> m = MyList('abc')
>>> m.append(m)
>>> m.append('x')
>>> print(m)
<'a'|'b'|'c'|...|'x'>

Repr 객체 (Repr Objects)

Repr 인스턴스는 서로 다른 객체 타입의 표현에 크기 제한을 제공하는 여러 속성과, 특정 객체 타입을 포맷하는 메서드를 제공해요.

  • Repr.fillvalue — 재귀 참조에 표시되는 문자열. 기본 .... 버전 3.11 추가.
  • Repr.maxlevel — 재귀 표현 생성의 깊이 제한. 기본 6.
  • Repr.maxdict, Repr.maxlist, Repr.maxtuple, Repr.maxset, Repr.maxfrozenset, Repr.maxdeque, Repr.maxarray — 이름 있는 객체 타입에 대해 표현되는 항목 수 제한. 기본은 maxdict 4, maxarray 5, 나머지 6.
  • Repr.maxlong — 정수 표현의 최대 문자 수. 숫자가 중간에서 잘려요. 기본 40.
  • Repr.maxstring — 문자열 표현의 최대 문자 수. 기본 30.
  • Repr.maxotherRepr 객체에 특정 포맷 메서드가 없는 객체 타입의 크기를 제어하는 데 사용. maxstring 과 비슷하게 적용. 기본 20.
  • Repr.indentNone(기본)이면 표준 repr() 처럼 줄바꿈이나 들여쓰기 없이 포맷돼요. 문자열로 설정하면 각 재귀 레벨이 그 문자열로 들여쓰여 별도 줄에 놓여요. 양의 정수로 설정하면 그 수만큼의 공백 문자열로 설정한 것처럼 동작해요. 버전 3.12 추가.
  • Repr.repr(obj) — 인스턴스가 부과하는 포맷을 사용하는 내장 repr() 과 동등한 것.
  • Repr.repr1(obj, level)repr() 이 사용하는 재귀 구현. obj 의 타입으로 어떤 포맷 메서드를 호출할지 결정해 objlevel 을 넘겨요.
  • Repr.repr_TYPE(obj, level) — 특정 타입의 포맷 메서드는 타입 이름에 기반한 이름의 메서드로 구현돼요. 재귀적으로 값을 포맷해야 하는 타입별 메서드는 self.repr1(subobj, level-1) 을 호출해야 해요.

Repr 객체 하위 클래스화 (Subclassing Repr Objects)

Repr.repr1() 의 동적 디스패치는 Repr 의 하위 클래스가 추가 내장 객체 타입 지원을 추가하거나 이미 지원되는 타입의 처리를 수정하도록 해요. 예제에서 파일 객체를 위한 특별 지원을 추가하는 방법을 볼 수 있어요.

import reprlib
import sys

class MyRepr(reprlib.Repr):

    def repr_TextIOWrapper(self, obj, level):
        if obj.name in {'<stdin>', '<stdout>', '<stderr>'}:
            return obj.name
        return repr(obj)

aRepr = MyRepr()
print(aRepr.repr(sys.stdin))         # prints '<stdin>'

더 알아보기 (Learn more)