
Python 3.14부터 t"..." 형태의 template string literal, 즉 t-string을 사용할 수 있습니다. 겉모양은 f-string과 비슷하지만 결과가 str이 아니라 string.templatelib.Template 객체라는 점이 핵심입니다.
t-string은 문자열을 바로 합치지 않고, 정적인 문자열 조각과 중괄호 안의 보간 값을 나눠 담습니다. 그래서 값을 문자열로 만들기 전에 HTML 이스케이프, 로그 구조화, SQL이나 shell 명령 처리처럼 별도의 규칙을 적용해야 하는 코드에서 검토할 수 있습니다.
t-string은 무엇이 다른가
f-string은 표현식을 평가한 뒤 최종 문자열을 만듭니다. 예를 들어 f"Hello {name}"은 바로 str 결과입니다. 반면 t"Hello {name}"은 Template 인스턴스를 만듭니다.
from string.templatelib import Template
name = "Kim"
template = t"Hello {name}"
print(type(template))
# <class 'string.templatelib.Template'>
Python 3.14.7 공식 문서 기준으로 t-string은 Python 3.14에 추가됐고, f-string과 같은 표현식 문법을 따릅니다. 다만 평가 결과를 곧바로 문자열로 포맷하지 않고, 템플릿 처리 코드가 다룰 수 있는 구조로 남깁니다.

Template에는 무엇이 들어 있나
Template 객체는 크게 strings, interpolations, values를 제공합니다. strings는 정적인 문자열 조각이고, interpolations는 중괄호 안 표현식에 대응하는 Interpolation 객체 목록입니다. values는 각 보간 값만 모은 튜플입니다.
name = "Kim"
template = t"Hello {name}!"
print(template.strings)
# ('Hello ', '!')
print(template.values)
# ('Kim',)
print(template.interpolations[0].expression)
# 'name'
strings 튜플은 항상 interpolations보다 하나 더 많은 항목을 가집니다. 보간 값이 문자열 조각 사이에 끼어 있는 형태이기 때문입니다. 보간이 없는 t""도 빈 문자열 하나를 strings에 담습니다.
Interpolation은 어떤 정보를 갖나
Interpolation은 보간된 값 하나를 나타냅니다. 주요 속성은 네 가지입니다.
| 속성 | 의미 | 확인할 점 |
|---|---|---|
value |
표현식을 평가한 실제 값 | t-string도 표현식 자체는 즉시 평가합니다. |
expression |
중괄호 안의 표현식 텍스트 | 처리 코드가 로그나 검증 메시지에 활용할 수 있습니다. |
conversion |
!s, !r, !a 변환 지정자 |
f-string처럼 자동 적용되지 않고 처리 코드가 해석합니다. |
format_spec |
:.2f 같은 포맷 지정 문자열 |
처리 코드가 적용 여부와 방식을 결정합니다. |
중요한 차이는 변환과 포맷 지정이 자동으로 최종 문자열에 반영되지 않는다는 점입니다. t-string에서는 Interpolation 객체에 그 정보가 남고, 템플릿 처리 함수가 어떻게 쓸지 결정합니다. 공식 문서는 f-string의 변환 의미를 흉내 내고 싶을 때 string.templatelib.convert()를 사용할 수 있다고 설명합니다.
처리 함수는 어떻게 작성하나
Template은 순회할 수 있습니다. 순회하면 비어 있지 않은 문자열 조각과 Interpolation 객체가 원래 순서대로 나옵니다. 그래서 처리 함수는 각 항목을 보면서 정적 문자열은 그대로 붙이고, 보간 값은 필요한 규칙을 적용한 뒤 결과를 만들 수 있습니다.

from html import escape
from string.templatelib import Interpolation, Template
def html_text(template: Template) -> str:
parts = []
for item in template:
if isinstance(item, Interpolation):
parts.append(escape(str(item.value)))
else:
parts.append(item)
return "".join(parts)
user_input = "<script>"
print(html_text(t"<p>{user_input}</p>"))
# <p><script></p>
이 예시는 t-string이 자동으로 HTML을 안전하게 만든다는 뜻이 아닙니다. t-string은 값과 정적 문자열을 분리해서 전달할 뿐입니다. 실제 이스케이프, 허용 태그, 속성 처리 같은 보안 규칙은 처리 함수가 책임져야 합니다.
f-string과 t-string은 어떻게 고르나
일반적인 출력 문자열에는 f-string이 더 단순합니다. 사람이 읽을 메시지, 예외 메시지, 간단한 디버그 출력처럼 최종 문자열이 바로 필요하면 f-string을 쓰는 편이 맞습니다.
t-string은 최종 문자열을 만들기 전에 값의 종류, 표현식 이름, 변환 지정자, 포맷 지정자를 따로 보고 싶을 때 유용합니다. 예를 들어 HTML 템플릿, 구조화 로깅, 안전한 명령 생성기, 도메인 전용 템플릿 처리 함수처럼 정적 문자열과 동적 값을 다르게 취급해야 하는 경우입니다.

| 상황 | 기본 선택 | 이유 |
|---|---|---|
| 최종 문자열을 바로 만들면 되는 경우 | f-string |
문법이 짧고 결과가 곧바로 str입니다. |
| 동적 값에 이스케이프나 검증을 적용해야 하는 경우 | t-string |
정적 부분과 보간 값을 처리 함수가 구분할 수 있습니다. |
| 보간 표현식 이름이나 포맷 지정자도 처리 규칙에 필요한 경우 | t-string |
Interpolation 객체가 관련 정보를 보존합니다. |
| Python 3.13 이하도 지원해야 하는 라이브러리 | 별도 호환 경로 | t-string 문법은 Python 3.14 이상에서만 사용할 수 있습니다. |
주의할 점
첫째, t-string은 지연 평가 템플릿이 아닙니다. 중괄호 안 표현식은 t-string이 실행되는 시점에 평가됩니다. 값만 나중에 평가되는 구조라고 생각하면 안 됩니다.
둘째, Template과 Interpolation은 불변 객체입니다. 이미 만들어진 템플릿의 속성을 다시 대입하는 방식으로 내용을 바꾸는 용도가 아닙니다.
셋째, Template과 일반 str을 바로 더하는 것은 지원되지 않습니다. 문자열을 정적 조각으로 붙일지, 동적 보간 값으로 볼지 모호하기 때문입니다. 필요한 경우 Template("text") 또는 Interpolation(value, "name")처럼 의미를 명시해야 합니다.
넷째, 보안은 처리 함수의 설계에 달려 있습니다. t-string을 쓴다는 사실만으로 SQL injection, command injection, XSS가 자동으로 막히지는 않습니다. 입력 값을 어떤 문맥에 넣는지에 맞춰 검증과 이스케이프 규칙을 별도로 구현해야 합니다.
FAQ
t-string은 기존 string.Template과 같은 기능인가
다릅니다. 기존 string.Template은 달러 기호 기반의 템플릿 문자열 처리 도구입니다. Python 3.14의 t-string은 언어 문법으로 추가된 template string literal이며, string.templatelib.Template 객체를 만듭니다.
t-string은 f-string보다 안전한가
그 자체로 안전하다고 말할 수는 없습니다. t-string은 정적 문자열과 동적 값을 분리해 처리할 기회를 제공합니다. 안전성은 그 Template을 받는 처리 함수가 올바른 문맥별 규칙을 적용하는지에 달려 있습니다.
format specifier는 f-string처럼 바로 적용되나
아닙니다. t-string에서는 format_spec 정보가 Interpolation에 보관됩니다. 처리 함수가 그 값을 읽고 format()을 적용할지, 다른 의미로 해석할지 결정합니다.
Python 3.14 이전 버전에서 쓸 수 있나
t-string 문법은 Python 3.14에 추가됐습니다. Python 3.13 이하 인터프리터에서 t"..." 문법을 쓰면 실행 전에 문법 단계에서 막힙니다. 하위 버전을 지원해야 하는 패키지는 별도 구현이나 조건부 코드를 준비해야 합니다.
'프로그래밍 > C, C++, Java, Python' 카테고리의 다른 글
| Java Compact Object Headers 기준 (0) | 2026.08.13 |
|---|---|
| Python InterpreterPoolExecutor 사용법 (0) | 2026.08.04 |
| Python Path.info 사용법 (1) | 2026.08.01 |
| Python annotationlib 사용법 (0) | 2026.07.26 |
| Python copy.replace 사용법 (0) | 2026.07.23 |





