표준 라이브러리 살펴보기 (2부)

표준 라이브러리 살펴보기 (2부)

1부에서 운영 체제·수학·데이터 교환 도구를 봤다면, 이번에는 표준 라이브러리의 '두 번째 바퀴'를 돌아볼게요. 출력을 보기 좋게 포맷하는 reprlib·pprint, 문자열을 템플릿으로 만드는 string.Template, 이진 데이터 레이아웃을 다루는 struct 같은 도구가 있어요. 여기에 멀티스레딩 threading, 로깅 logging, 그리고 목록을 더 잘 쓰게 도와주는 collections.deque·heapq·bisect, 정확한 소수를 위한 decimal까지 함께 살펴볼게요.

출처: 11. Brief Tour of the Standard Library — Part II — Python 공식 튜토리얼

출력 포맷팅: reprlib · pprint

큰 컨테이너를 출력할 때 전체를 그대로 찍으면 눈에 잘 안 들어와요. reprlib는 대형·중첩 컨테이너의 repr()을 축약해 주고, pprint는 줄바꿈과 들여쓰기를 넣어 구조를 한눈에 보이게 만들어요.

import reprlib
reprlib.repr(set('supercalifragilisticexpialidocious'))
# "{'a', 'c', 'd', 'e', 'f', 'g', ...}"
import pprint
pprint.pprint([{'name': 'x', 'n': 1}, {'name': 'y', 'n': 2}])

복잡한 데이터 구조를 디버깅할 때 pprint는 내장 print보다 훨씬 읽기 편해요. textwrap 모듈은 문단을 지정한 화면 폭에 맞게 줄 바꿔 주고, locale 모듈은 천 단위 구분자 같은 문화권별 숫자 형식을 다룰 때 써요.

문자열 템플릿: string.Template

string.Template은 사용자가 직접 수정해도 되도록 단순한 문법의 템플릿 클래스를 제공해요. $name 같은 자리표시자를 두고 substitute()로 값을 채우는 방식이라, 애플리케이션 코드를 바꾸지 않고 사용자 입맛에 맞게 포맷을 조정할 수 있게 해줘요.

from string import Template
t = Template('Hello, $name!')
t.substitute(name='world')   # 'Hello, world!'

이진 데이터 레이아웃: struct

struct 모듈은 이진 레코드 포맷을 다루는 pack()·unpack() 함수를 제공해요. 파일 헤더나 네트워크 프로토콜처럼 고정된 이진 구조를 읽을 때 유용하죠. 포맷 문자열에서 "H"는 2바이트, "I"는 4바이트 부호 없는 정수를 뜻해요.

import struct
struct.pack('>I', 1024)     # 4바이트 빅엔디안 정수
last, first = struct.unpack('>HH', b'\x00\x02\x00\x03')

멀티스레딩: threading

멀티스레드 프로그램의 핵심 어려움은 데이터나 자원을 공유하는 스레드를 어떻게 조율하느냐예요. threading 모듈은 락(lock)·이벤트(event)·조건 변수(condition)·세마포어(semaphore) 같은 동기화 도구를 제공해서, 공유 상태에 대한 경쟁을 제어할 수 있게 해 줘요.

로깅: logging

logging 모듈은 기능이 풍부하고 유연한 로깅 시스템을 제공해요. 가장 단순하게는 로그 메시지를 파일이나 sys.stderr로 보내고, 필요하면 심각도(severity)별 필터·출력 포맷을 조절할 수 있어 print 대신 운영 로그로 쓰기 좋아요.

import logging
logging.basicConfig(level=logging.INFO)
logging.info('처리 시작')

목록 활용 도구: array · collections · bisect · heapq

표준 목록을 대체하거나 보완해 주는 도구도 여러 개 있어요.

  • array — 동일 타입 데이터만 담는, 메모리 효율적인 배열 객체를 제공해요.
  • collections.deque — 양쪽 끝의 추가·삭제가 빠른 데크로, 큐와 너비 우선 탐색에 잘 맞아요.
  • bisect — 정렬된 목록에 항목을 넣거나 검색하는 함수들을 제공해요.
  • heapq — 일반 목록 기반의 힙을 구현해, 최솟값을 자주 꺼내야 할 때 유용해요.
from heapq import heapify, heappop, heappush
data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
heapify(data)
heappush(data, -5)
[heappop(data) for i in range(3)]   # [-5, 0, 1]

힙은 '가장 작은 항목을 매번 찾고 싶은데 전체 정렬은 하고 싶지 않을 때' 딱 맞는 구조예요.

정확한 소수: decimal

decimal 모듈은 10진 부동소수점 연산을 위한 Decimal 타입을 제공해요. 내장 float은 이진 부동소수점이라 금액 계산처럼 정확성이 중요한 곳에서는 오차가 쌓일 수 있어요. Decimal은 사람이 기대하는 십진 결과를 더 정확하게 만들어서 회계·금융 계산에 좋아요.

더 알아보기