- t-문자열(t-strings) 은 Python 3.14에서 새롭게 도입될 안전하고 유연한 문자열 처리 기능임
- 기존 f-string과 달리, t-string은 문자열이 아닌
Template객체로 반환되어 자동 출력 없이 안전한 처리 가능 - t-string은 HTML, SQL 등 동적 입력을 안전하게 이스케이프할 수 있는 구조를 갖고 있음
- JavaScript의 **태그 템플릿(tagged templates)**과 유사한 개념으로, 다양한 변환 및 처리 확장이 가능함
- Python 개발 도구 생태계가 이 기능을 잘 지원한다면, 웹/보안 중심의 문자열 처리 방식에 큰 변화를 줄 수 있음
Python의 새 기능: t-문자열(Template Strings)
- Python 3.14부터
t"..."문법으로 사용하는 Template 문자열(t-strings) 이 공식 기능으로 도입됨 - 기존 f-string과 달리, t-string은 즉시 문자열이 아닌
string.templatelib.Template객체로 평가됨 - 이 객체는 출력 전 별도의 가공 과정이 필요하며, 이 과정을 통해 동적 값의 안전한 처리 및 변환 가능
왜 f-string이 위험할 수 있는가?
- f-string은 즉시 문자열로 평가되기 때문에, 사용자 입력을 포함한 코드에서 SQL Injection이나 XSS 발생 가능
- 예:
f"<div>{user_input}</div>"→ 공격 코드가 직접 삽입될 수 있음
- 예:
- t-string은 이러한 평가를 지연시켜 명시적으로 가공해야만 사용 가능하게 함
t-string의 예시 사용
-
HTML 이스케이프 처리 예시:
evil = "<script>alert('bad')</script>" template = t"<p>{evil}</p>" safe = html(template) # safe는 "<p><script>alert('bad')</script></p>" -
속성 자동 삽입 등 더 복잡한 처리도 가능:
attributes = {"src": "roquefort.jpg", "alt": "Yum"} template = t"<img {attributes} />" element = html(template) # 결과: "<img src='roquefort.jpg' alt='Yum' />"
구조와 API
-
Template객체는.strings,.values속성을 통해 원본 텍스트와 대입값을 분리해 제공 -
interpolations속성을 통해!s,:>8등 포맷 세부 정보까지 접근 가능 -
순회(iteration)를 통해 텍스트와 값이 섞인 상태도 직접 가공 가능
-
수동 생성도 가능:
from string.templatelib import Template, Interpolation template = Template( "Hello ", Interpolation(value="World", expression="name"), "!" )
재미있는 예시: 돼지 라틴어 변환기
-
Template 객체의 내용을 순회하며 단어를 Pig Latin으로 변환하는 예제:
def pig_latin(template: Template) -> str: ... name = "world" template = t"Hello {name}!" assert pig_latin(template) == "Hello orldway!"
향후 발전 방향
- t-strings는 웹/보안 중심의 문자열 처리 방식에 안전성과 확장성을 가져올 수 있음
black,ruff, VS Code 등 개발 도구가 t-string 포맷/하이라이팅을 지원하길 기대- JavaScript 개발자가 익숙한 tagged template 방식과 유사해, 여러 프레임워크에서도 활용 가능성 높음
개발자 커뮤니티와의 협업
- 본 기능은 다양한 Python 커뮤니티 멤버들의 참여와 협업을 통해 완성됨
- 특히 Jim, Paul, Koudai, Lysandros, 그리고 Guido 등 핵심 인물들과의 교류가 언급됨
- PEP 750과 그 예제 저장소는 GitHub에서 확인 가능
Python 3.14의 t-문자열 기능은 문자열의 안전성과 확장성을 동시에 확보하며, 기존 f-string의 한계를 넘는 중요한 도약임