순환 보존
이것은 pyrs-yaml의 핵심 기능 — Python YAML 라이브러리 중에서 독보적인 특징입니다.
순환 보존이란?¶
순환 보존은: YAML 파싱 → 수정 → 직렬화 → 출력이 입력과 동일하거나 의미적으로 동등함을 의미합니다.
라운드트립 예제
original = """
# 서버 설정
server:
host: 0.0.0.0
port: 8080 # 메인 포트
# 데이터베이스 앵커
database: &db
host: localhost
port: 5432
api:
<<: *db
endpoint: /api/v1
"""
doc = pyrs_yaml.parse(original)
output = doc.to_yaml()
# 모든 포맷과 메타데이터가 보존됨
assert "# 서버 설정" in output
assert "# 메인 포트" in output
assert "&db" in output
# 참고: 병합 키(<<)는 기본적으로 해석(실체화)되어 그대로 출력되지 않습니다.
# <<: *db를 그대로 유지하려면 resolve_merges=False를 사용하세요
보존되는 것¶
| 요소 | 보존 여부 | 설명 |
|---|---|---|
| 독립형 주석 | 키와 값 앞 | |
| 인라인 주석 | 줄 끝 | |
앵커 (&name) |
완전한 앵커 구문 | |
별칭 (*name) |
별칭 참조 해석됨 | |
병합 키 (<<) |
기본적으로 해석됨; resolve_merges=False로 유지 |
|
태그 (!!str, !!int) |
명시적 태그 보존됨 | |
| 스칼라 스타일 | Plain, 따옴표, 리터럴, 폴드 | |
청핑 (\|-, >-) |
블록 스칼라 표시자 | |
| 플로우/블록 스타일 | []/{} vs 블록 보존됨 |
|
| 컴팩트 시퀀스 항목 | - host: a가 대시 줄에 유지됨 (메타데이터 없는 매핑 항목만) |
|
| 키 순서 | IndexMap이 순서 보장 |
PyYAML vs pyrs-yaml 순환 보존¶
PyYAML 비교
original = "# 주석\nkey: value # 인라인\n"
# PyYAML: 모든 것을 잃음
yaml.safe_dump(yaml.safe_load(original))
# 출력: 'key: value\n' :material-close:
# pyrs-yaml: 모든 것을 보존
doc = pyrs_yaml.parse(original)
doc.to_yaml()
# 출력: '# 주석\nkey: value # 인라인\n' :material-check:
성능¶
다른 라이브러리와의 순환 성능 비교:
| 라이브러리 | 순환 보존 (대용량) | 주석 | 앵커 | 태그 |
|---|---|---|---|---|
| pyrs-yaml | 0.08 ms | |||
| PyYAML | 2.98 ms | |||
| ruamel.yaml | 6.79 ms |
pyrs-yaml는 PyYAML보다 37배, ruamel.yaml보다 85배 빠르면서 모든 것을 보존합니다.