IT프로그래밍/파이썬

파이썬 t-string 사용법 : f-string과 다른 점과 Python 3.14 처리 원리

MannizDev 2026. 9. 2.

파이썬에서 변수 값을 문장에 넣을 때는 보통 f"안녕하세요, {name}님"처럼 f-string을 사용합니다. Python 3.14에는 앞의 ft로 바꾼 t-string이 새로 들어왔습니다. 모양은 비슷하지만 결과는 전혀 다릅니다.

f-string은 변수 값까지 합친 완성 문자열을 바로 만듭니다. t-string은 고정된 글자와 중괄호 안의 값을 따로 보관한 Template 객체를 만듭니다. 따라서 평범한 출력에는 여전히 f-string이 간단하고, 값을 합치기 전에 검사하거나 변환해야 할 때 t-string을 처리 함수와 함께 사용합니다.

f-string은 값을 하나의 문자열로 합치고 t-string은 동적 값을 Template에 분리해 두는 차이

직접 확인한 환경

  • Windows
  • Python 3.14.7 공식 Windows 임베디드 배포본
  • 비교 실행 : Python 3.9.13
  • 확인일 : 2026년 9월 2일

Python.org에 따르면 Python 3.14.7은 2026년 8월 5일 공개된 3.14 계열의 일곱 번째 유지보수 릴리스입니다. 이 글에서는 공식 64비트 임베디드 배포본의 SHA-256 값까지 확인한 뒤 예제 네 개를 직접 실행했습니다.

Python 3.14를 아직 준비하지 않았다면 Python Install Manager 사용법에서 설치와 버전 확인 흐름을 먼저 볼 수 있습니다.

t-string은 왜 필요한가

사용자가 입력한 이름을 문장에 넣는다고 해 보겠습니다.

name = "민수"
message = f"안녕하세요, {name}님"

f-string은 name의 값을 바로 문자열 안에 넣습니다.

입력 : "민수"
처리 : 고정 글자와 name 값을 즉시 합친다
출력 : "안녕하세요, 민수님"이라는 str 객체

화면에 문장을 출력하는 목적이라면 이 동작이 알맞습니다. 문제는 HTML, SQL, 로그처럼 동적 값을 합치기 전에 별도 규칙으로 검사하거나 변환해야 하는 경우입니다. f-string은 이미 하나의 문자열로 합쳐진 뒤라서 어느 부분이 개발자가 쓴 고정 글자이고 어느 부분이 외부에서 들어온 값인지 구분하기 어렵습니다.

t-string은 이 둘을 합치지 않고 나누어 보관합니다.

name = "민수"
template = t"안녕하세요, {name}님"
입력 : 고정 글자와 name 값
처리 : 고정 부분과 동적 부분을 구분해 보관한다
출력 : string.templatelib.Template 객체
불변 : name 변수의 값은 바뀌지 않는다
실패 : Python 3.13 이하에서는 t 접두사 문법을 인식하지 못한다

여기서 템플릿은 아직 최종 문장이 아니라, 어떤 글자와 값을 어떤 순서로 처리할지 담아 둔 재료라고 이해하면 됩니다.

첫 코드에서 f-string과 t-string 자료형을 비교합니다

첫 예제는 두 문법이 무엇을 만드는지 확인합니다.

name = "민수"
score = 92

f_message = f"{name}님의 점수는 {score}점입니다."
template = t"{name}님의 점수는 {score}점입니다."

print("f-string 자료형 :", type(f_message))
print("t-string 자료형 :", type(template))
print("고정 문자열 :", template.strings)
print("동적 값 :", template.values)
print("보간 정보 :", template.interpolations)

type()은 값의 자료형을 알려 주는 파이썬 기본 함수입니다. template.strings에는 개발자가 직접 쓴 고정 문자열이, template.values에는 중괄호 안 표현식을 계산한 값이 들어 있습니다.

실행 결과는 다음과 같습니다.

f-string 자료형 : <class 'str'>
t-string 자료형 : <class 'string.templatelib.Template'>
고정 문자열 : ('', '님의 점수는 ', '점입니다.')
동적 값 : ('민수', 92)
보간 정보 : (Interpolation('민수', 'name', None, ''), Interpolation(92, 'score', None, ''))

Python 3.14.7에서 f-string과 t-string의 자료형, 고정 문자열, 동적 값을 비교한 실행 결과

strings에 값이 세 개이고 values에는 두 개가 있습니다. 동적 값 두 개의 앞, 사이, 뒤에 고정 문자열이 놓이기 때문에 고정 문자열 개수가 하나 더 많습니다.

strings[0] + values[0] + strings[1] + values[1] + strings[2]
빈 문자열   + "민수"    + "님의 점수는 " + 92      + "점입니다."

중괄호로 값을 끼워 넣는 일을 보간이라고 합니다. interpolations의 각 Interpolation 객체에는 계산된 값뿐 아니라 원래 표현식인 name, score, 변환 방식, 서식 지정 정보가 따로 남습니다.

t-string은 바로 완성 문자열이 되지 않습니다

f-string 결과는 str이므로 그대로 출력하거나 파일에 쓸 수 있습니다. t-string 결과는 Template 객체입니다. print(template)을 실행하면 완성 문장 대신 객체의 구조가 표시됩니다.

name = "민수"
template = t"안녕하세요, {name}님"

print(template)
Template(strings=('안녕하세요, ', '님'), interpolations=(Interpolation('민수', 'name', None, ''),))

이 결과는 오류가 아닙니다. t-string의 목적이 값을 바로 합치는 것이 아니라 처리하기 전 상태를 유지하는 것이기 때문입니다. 최종 문자열이 필요하면 Template을 받아 원하는 규칙으로 조합하는 함수가 있어야 합니다.

공식 PEP 750도 단순한 문자열만 필요하고 별도의 안전 처리가 없다면 f-string이 알맞다고 설명합니다. t-string이 f-string을 없애거나 모든 문자열을 대체하는 문법은 아닙니다.

처리 함수가 Template을 최종 문자열로 바꿉니다

다음 render() 함수는 Template의 항목을 처음부터 하나씩 꺼냅니다. 고정 문자열이면 그대로 넣고, Interpolation이면 값과 서식을 처리한 뒤 넣습니다.

from string.templatelib import Interpolation, convert


def render(template):
    parts = []

    for part in template:
        if isinstance(part, Interpolation):
            value = convert(part.value, part.conversion)
            parts.append(format(value, part.format_spec))
        else:
            parts.append(part)

    return "".join(parts)

처음 보는 이름을 순서대로 읽어 보겠습니다.

  • Interpolation : 중괄호 안의 표현식과 계산된 값을 담는 자료형입니다.
  • convert() : !s, !r, !a 같은 변환 표시를 f-string과 비슷하게 적용합니다.
  • format() : :,, .2f 같은 서식 지정을 값에 적용합니다.
  • "".join(parts) : 처리한 조각을 빈 문자열 사이에 두고 하나로 합칩니다.

이 함수에 상품명과 가격을 담은 t-string을 넣어 보겠습니다.

product = "키보드"
price = 45000
message = t"{product} 가격은 {price:,}원입니다."

print(render(message))
키보드 가격은 45,000원입니다.

{price:,}에서 :,는 천 단위 쉼표를 표시하는 서식입니다. f-string에서는 파이썬이 이 서식을 바로 적용하지만, t-string에서는 Interpolation.format_spec,가 남고 처리 함수가 적용 여부를 결정합니다.

이 예제의 render()는 원리를 확인하기 위한 작은 함수입니다. 실제 서비스에서는 사용하는 HTML, SQL, 로그 라이브러리가 제공하는 처리 함수를 우선해야 합니다.

t-string이 값을 자동으로 안전하게 바꾸는 것은 아닙니다

t-string 소개에서 안전한 HTML이나 SQL 이야기가 자주 나오지만 한 가지를 꼭 구분해야 합니다.

t-string : 고정 문자열과 동적 값을 구분해 전달한다
처리 함수 : 동적 값을 어떤 규칙으로 검사하거나 변환할지 결정한다

t-string만 작성했다고 HTML 특수 문자가 자동으로 바뀌거나 SQL 인젝션이 막히는 것은 아닙니다. 안전성은 Template을 받는 처리 함수가 올바르게 구현됐을 때 생깁니다.

차이를 확인하기 위해 HTML 본문의 텍스트 한 곳만 다루는 작은 예제를 실행했습니다.

from html import escape
from string.templatelib import Interpolation


def html_text(template):
    parts = []

    for part in template:
        if isinstance(part, Interpolation):
            parts.append(escape(str(part.value), quote=True))
        else:
            parts.append(part)

    return "".join(parts)


user_input = "<script>alert('x')</script>"

unsafe_html = f"<p>{user_input}</p>"
safe_html = html_text(t"<p>{user_input}</p>")

print("f-string 결과 :", unsafe_html)
print("처리 함수 결과 :", safe_html)
f-string 결과 : <p><script>alert('x')</script></p>
처리 함수 결과 : <p>&lt;script&gt;alert(&#x27;x&#x27;)&lt;/script&gt;</p>

사용자 입력을 f-string으로 바로 합친 결과와 t-string 처리 함수에서 HTML 이스케이프한 결과 비교

f-string 결과에는 입력한 태그 모양이 그대로 들어갑니다. html_text()는 동적 값에만 html.escape()를 적용해 <, >, 작은따옴표를 HTML 문자 참조로 바꿉니다. 고정 문자열인 <p></p>는 그대로 둡니다.

다만 이 함수는 HTML 요소 안의 단순 텍스트 한 곳을 설명하기 위한 예제입니다. 태그 속성, URL, CSS, JavaScript처럼 위치에 따라 필요한 처리 규칙이 다르므로 실제 웹 페이지를 이 짧은 함수 하나로 만들면 안 됩니다. t-string은 안전 처리를 가능하게 하는 구조이지, 그 자체가 완성된 보안 도구는 아닙니다.

SQL도 같은 기준으로 봐야 합니다. t-string을 직접 문자열로 합치는 처리기를 만들어 SQL에 넣지 말고, 데이터베이스 라이브러리의 매개변수 바인딩 기능을 사용해야 합니다.

Python 3.13 이하에서는 SyntaxError가 발생합니다

t-string은 Python 3.14에서 추가된 문법입니다. 같은 파일을 Python 3.9.13으로 실행해 다음 오류를 직접 확인했습니다.

name = "민수"
message = t"안녕하세요, {name}님"

print(type(message))
  File "04_requires_python_314.py", line 2
    message = t"안녕하세요, {name}님"
               ^
SyntaxError: invalid syntax

Python 3.9.13에서 t-string을 실행해 SyntaxError가 발생한 결과

이 오류가 나오면 코드 철자보다 실행 중인 Python 버전을 먼저 확인합니다.

python --version

Python 3.14 이상이 아니라면 t-string을 사용할 수 없습니다. 여러 버전이 설치된 Windows에서는 python 명령이 예상과 다른 버전을 가리킬 수 있으므로 다음 코드로 실제 실행 파일도 확인할 수 있습니다.

python -c "import sys; print(sys.version); print(sys.executable)"

기존 프로젝트가 Python 3.13 이하도 지원해야 한다면 t-string 문법을 넣는 순간 파일 자체를 해석하지 못합니다. 일부 실행 경로에서만 쓰더라도 구버전 파이썬이 파일을 읽으면 SyntaxError가 나므로, 지원 버전을 3.14 이상으로 올리거나 f-string과 기존 처리 라이브러리를 유지해야 합니다.

f-string과 t-string은 이렇게 선택합니다

확인할 점 f-string t-string
처음 만들어지는 값 완성된 str Template 객체
동적 값 구분 이미 문자열에 합쳐짐 Interpolation으로 분리됨
바로 출력 가능 처리 함수가 먼저 필요
서식 적용 파이썬이 즉시 적용 처리 함수가 결정
사용할 수 있는 버전 Python 3.6 이상 Python 3.14 이상
알맞은 상황 일반 출력과 간단한 문자열 조합 검사, 변환, 구조화된 로그 같은 사용자 정의 처리

처음 배울 때는 tf의 최신 대체 문법이라고 외우지 않는 것이 좋습니다. 결과 자료형부터 구분하면 선택이 쉬워집니다.

지금 필요한 결과가 완성 문자열인가? → f-string
값을 합치기 전에 처리 함수가 각 동적 값을 알아야 하는가? → t-string 검토
검증된 처리 함수나 라이브러리가 없는가? → 직접 만든 짧은 처리기를 보안 기능으로 사용하지 않기

Python print 사용법에서 f-string의 기본 출력 방식을 먼저 익힌 뒤 이 차이를 보면 더 자연스럽습니다. 자료형이 아직 낯설다면 파이썬 자료형 기초에서 str이 무엇인지 이어서 확인할 수 있습니다.

참고한 공식 문서

댓글

💲 추천 글