reprlib — 대체 repr() 구현
reprlib — 대체 repr() 구현
reprlib 모듈은 결과 문자열의 크기에 제한을 두고 객체 표현을 생성하는 수단을 제공해요. 이것은 파이썬 디버거에서 사용되며 다른 문맥에서도 유용할 수 있어요. 크기가 커서 위험한 객체 표현이 무한정 자라거나 너무 길어지는 걸 막아 주는 게 핵심이에요.
본문
이 모듈은 클래스, 인스턴스, 함수 하나를 제공해요.
-
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) —
aRepr의repr()메서드예요. 같은 이름의 내장 함수가 반환하는 문자열과 비슷하지만 대부분 크기에 제한이 있는 문자열을 반환해요.
크기 제한 도구 외에도 이 모듈은 __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 — 이름 있는 객체 타입에 대해 표현되는 항목 수 제한. 기본은
maxdict4,maxarray5, 나머지 6. - Repr.maxlong — 정수 표현의 최대 문자 수. 숫자가 중간에서 잘려요. 기본
40. - Repr.maxstring — 문자열 표현의 최대 문자 수. 기본
30. - Repr.maxother —
Repr객체에 특정 포맷 메서드가 없는 객체 타입의 크기를 제어하는 데 사용.maxstring과 비슷하게 적용. 기본20. - Repr.indent —
None(기본)이면 표준repr()처럼 줄바꿈이나 들여쓰기 없이 포맷돼요. 문자열로 설정하면 각 재귀 레벨이 그 문자열로 들여쓰여 별도 줄에 놓여요. 양의 정수로 설정하면 그 수만큼의 공백 문자열로 설정한 것처럼 동작해요. 버전 3.12 추가. - Repr.repr(obj) — 인스턴스가 부과하는 포맷을 사용하는 내장
repr()과 동등한 것. - Repr.repr1(obj, level) —
repr()이 사용하는 재귀 구현. obj 의 타입으로 어떤 포맷 메서드를 호출할지 결정해 obj 와 level 을 넘겨요. - 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>'