t-string در پایتون چیست؟
در نسخه ۳.۱۴ پایتون، یک ویژگی جدید با عنوان Template Strings یا به اختصار t-strings معرفی شده است (مطابق با PEP 750) . اگر تا به امروز با f-stringها کار کرده باشی (مثلا f"Hello {name}") احتمالا فکر میکنی که «خب، دوباره چه چیزی اضافه شده؟» — اما این ویژگی با هدفی متفاوت ارائه شده و میتواند در برخی سناریوها بسیار مفید باشد.
تعریف دقیق: t-string چیست؟
یک t-string در پایتون، با پیشوند t (یا T) در مقابل رشته literal تعریف میشود، مثلا:
template = t"Hello, {name}!"
در واقع نتایج زیر را دارد:
اینکه نوع مقدار به دست آمده یک str معمولی نیست، بلکه یک شیء از نوع Template است که در ماژول استاندارد string.templatelib تعریف شده.
این شی Template اطلاعات بیشتری را نگهداری میکند؛ مثلاً بخشهای ثابت رشته و بخشهای جایگذاری شده (interpolations) را جدا میکند.
در نتیجه، میتوان بعد از ساخت آن، پردازش بیشتری روی بخشهای جایگذاری شده انجام داد — مثلا برای مصونسازی امنیتی، فرمتدهی ویژه، یا تولید کد برای زبانهای دیگر.
چرا به t-string نیاز داریم؟
چند دلیل وجود دارد که این قابلیت جدید میتواند مفید باشد:
1. تفکیک ساختار ثابت از مقادیر پویا: در f-stringها، رشته نهایی همانجا تولید میشود و دیگر تفکیکی بین متن ثابت و مقدار جایگذاری شده وجود ندارد (مثلاً "Hello Alice!"). در t-string، این تفکیک وجود دارد: Template نگه میدارد که «متن ثابت اینها هستند» و «مقادیر این بخشها هستند».
name = "ali" template = t"hi i am {name}"
2. قابلیت بازاستفاده قالبها: چون Template شی است که میتوان آن را جدا از داده نگهداری کرد و بعد مقادیرش را گذاشت، میتوان برای تولید متنهای متنوع با همان ساختار ثابت استفاده کرد.
چگونه از t-string استفاده کنیم؟
مثال اولیه
from string.templatelib import Template user = "Alice" template = t"Welcome, {user}!" assert isinstance(template, Template) # True print(template.strings) # بخشهای ثابت رشته print(template.values) # مقادیر جایگذاری شده
پیمایش بخشها
for part in template:
if isinstance(part, str):
print(" ثابت:", part)
else:
# part یک Interpolation است
print(" جایگذاری شده:", part.value)
الحاق قالبها (Concatenation)
میتوان دو t-string را بههم چسباند تا قالب بزرگتری ساخت:
first = t"{first_name} "
second = t"{last_name}"
full = first + second
raw t-string (پیشوند r و t)
اگر بخواهی از محتوایی استفاده کنی که شامل بکاسلش (\) یا الگوهای رگیولار اکسپرشن است، میتوانی از rt یا tr استفاده کنی:
rt"Path: {path}, Pattern: {regex}"
محدودیتها / نکاتی که باید بدانیم
t-string رشته عادی نیست: یعنی اگر تابعی انتظار یک str بکند، نمیتوان مستقیما یک Template را به آن داد (بدون تبدیل صریح). برخی APIها ممکن است تغییر کنند تا Template را بپذیرند.
چون این ویژگی تازه وارد است، هنوز همهی کتابخانهها آن را پشتیبانی نمیکنند یا ممکن است مستنداتشان بروز نشده باشد.
اگر صرفا میخواهی یک رشته تولید کنی و نیازی به پردازش ویژه نداری، f-string کماکان سادهتر و مناسبتر است. t-string زمانی مفیدتر است که بخواهی قالب را به صورت جداگانه مدیریت کنی یا بخشهای جایگذاری شده را برای اهداف خاص (امنیتی، تولید کد، …) پردازش کنی.
کاربردهای واقعی:
تولید SQL یا دستورهای پایگاه داده با تضمین اینکه مقادیر جایگذاری شده امن هستند.
تولید HTML یا خروجی تحت وب و اطمینان از اینکه مقادیر کاربر به درستی escape شدهاند.
تولید قالبهای متنی و محلیسازی (localization) که ساختار ثابت دارند اما مقادیرشان تغییر میکند.
ابزارهایی که لازم دارند تشخیص بدهند کدام قسمت از رشته ثابت است و کدام قسمت پویا – مثلاً برای کشینگ، برای linting، برای تحلیل امنیتی.
پروژههای آموزشی یا کتابخانههایی که میخواهند قالب را به صورت شیء نگه دارند تا بعدا پردازش شود.
جمعبندی
ویژگی t-string در پایتون نسخه ۳.۱۴ یک گام مهم در مسیر «قالبدهی متون بهصورت امنتر و انعطافپذیرتر» است. اگرچه برای همهی موارد لازم نیست، اما زمانی که بخواهی قالبها را جدا از دادهها نگه داری، یا بخش جایگذاری را با هدف خاصی پردازش کنی، انتخاب بسیار خوبی هستش. نظر شما چیه؟!