Skip to content

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>&lt;script&gt;alert('evil')&lt;/script&gt;</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: 서식 문자열

See also

Favorite site