PEP 750
Template Strings
About
- PEP 750은 Python에 새로운 문자열 리터럴인 템플릿 문자열(t"...") 을 도입함
- f-string의 일반화된 형태로, Template 타입을 생성하여 문자열과 삽입 값을 결합 전 처리할 수 있는 기능 제공
- 웹 템플릿, 보안 검사, DSL(Domain-Specific Language) 등에 유용하게 사용 가능함
다른 PEP들과의 관계
- f-string은 PEP 498로 도입되었고, PEP 701에서 문법이 확장됨
- PEP 501은 일반 템플릿 문자열(i-string)을 제안했지만 보류됨
- 현재 PEP 750은 PEP 501을 단순화 및 일반화한 형태로, 기존 아이디어를 기반으로 발전됨
동기 및 필요성
- f-string은 간단하지만, 삽입 값을 사전에 가공할 수 없어 보안상 문제 발생 가능
- SQL 삽입, XSS 공격 등 보안 취약점 유발 우려 있음
- 템플릿 문자열을 사용하면 삽입 값을 사전에 가공하여 안전하게 사용할 수 있음
예시:
evil = "<script>alert('evil')</script>"
template = t"<p>{evil}</p>"
assert html(template) == "<p><script>alert('evil')</script></p>"
템플릿 문자열의 사양
템플릿 문자열 리터럴
- 접두사 t 또는 T를 사용해 정의
- string.templatelib.Template 타입으로 평가됨
- f-string과 유사한 문법 지원, 중첩도 가능
- r 접두사와 조합 가능 (rt, tr)
- u, b 접두사와는 조합 불가
- f-string과 템플릿 문자열은 혼합 사용 불가
Template 타입
- 불변 타입이며, 다음 속성을 가짐:
- strings: 문자열 조각들의 튜플
- interpolations: 삽입값 객체들의 튜플
- values: 삽입값들의 값 튜플
- iter(): 문자열과 삽입값을 순서대로 반환하는 이터레이터
Interpolation 타입
- value: 평가된 결과
- expression: 원래 삽입 표현식 문자열
- conversion: 변환 방식 (r, s, a 또는 None)
- format_spec: 서식 문자열