`t-strings` mới của Python
(davepeck.org)- t-string (chuỗi mẫu) là tính năng xử lý chuỗi an toàn và linh hoạt mới được giới thiệu trong Python 3.14
- Khác với f-string hiện có, t-string trả về đối tượng
Templatethay vì chuỗi, nên có thể xử lý an toàn mà không tự động xuất ra ngay - t-string có cấu trúc cho phép escape an toàn dữ liệu đầu vào động như HTML, SQL, v.v.
- Đây là khái niệm tương tự tagged templates của JavaScript, cho phép mở rộng nhiều kiểu biến đổi và xử lý khác nhau
- Nếu hệ sinh thái công cụ phát triển Python hỗ trợ tốt tính năng này, nó có thể tạo ra thay đổi lớn trong cách xử lý chuỗi theo hướng web/bảo mật
Tính năng mới của Python: t-string (Template Strings)
- Từ Python 3.14, chuỗi Template (t-strings) dùng cú pháp
t"..."sẽ được đưa vào như một tính năng chính thức - Khác với f-string hiện có, t-string được đánh giá thành đối tượng
string.templatelib.Templatechứ không phải chuỗi ngay lập tức - Đối tượng này cần một bước xử lý riêng trước khi xuất ra, và thông qua bước đó có thể xử lý, chuyển đổi giá trị động một cách an toàn
Vì sao f-string có thể nguy hiểm?
- Vì f-string được đánh giá thành chuỗi ngay lập tức, trong mã có chứa đầu vào người dùng có thể phát sinh SQL Injection hoặc XSS
- Ví dụ:
f"<div>{user_input}</div>"→ mã tấn công có thể bị chèn trực tiếp
- Ví dụ:
- t-string trì hoãn việc đánh giá này, khiến nó chỉ có thể được sử dụng sau khi đã xử lý một cách tường minh
Ví dụ sử dụng t-string
-
Ví dụ xử lý escape HTML:
evil = "<script>alert('bad')</script>" template = t"<p>{evil}</p>" safe = html(template) # safe는 "<p><script>alert('bad')</script></p>" -
Cũng có thể xử lý phức tạp hơn như tự động chèn thuộc tính:
attributes = {"src": "roquefort.jpg", "alt": "Yum"} template = t"<img {attributes} />" element = html(template) # 결과: "<img src='roquefort.jpg' alt='Yum' />"
Cấu trúc và API
-
Đối tượng
Templatecung cấp riêng văn bản gốc và các giá trị nội suy thông qua thuộc tính.strings,.values -
Qua thuộc tính
interpolations, có thể truy cập cả chi tiết định dạng như!s,:>8 -
Thông qua iteration, cũng có thể trực tiếp xử lý trạng thái trộn giữa văn bản và giá trị
-
Cũng có thể tạo thủ công:
from string.templatelib import Template, Interpolation template = Template( "Hello ", Interpolation(value="World", expression="name"), "!" )
Ví dụ thú vị: bộ chuyển đổi Pig Latin
-
Ví dụ biến đổi các từ trong nội dung của đối tượng Template sang Pig Latin bằng cách duyệt qua nó:
def pig_latin(template: Template) -> str: ... name = "world" template = t"Hello {name}!" assert pig_latin(template) == "Hello orldway!"
Hướng phát triển trong tương lai
- t-strings có thể mang lại tính an toàn và khả năng mở rộng cho cách xử lý chuỗi theo hướng web/bảo mật
- Kỳ vọng các công cụ phát triển như
black,ruff, VS Code sẽ hỗ trợ định dạng/highlighting cho t-string - Vì tương tự cách tagged template mà các lập trình viên JavaScript đã quen thuộc, nó cũng có tiềm năng được ứng dụng trong nhiều framework
Hợp tác với cộng đồng lập trình viên
- Tính năng này được hoàn thiện nhờ sự tham gia và hợp tác của nhiều thành viên trong cộng đồng Python
- Đặc biệt có nhắc đến việc trao đổi với các nhân vật chủ chốt như Jim, Paul, Koudai, Lysandros và Guido
- Có thể xem PEP 750 và kho ví dụ của nó trên GitHub
Tính năng t-string của Python 3.14 đồng thời đảm bảo tính an toàn và khả năng mở rộng cho chuỗi, là một bước tiến quan trọng vượt qua giới hạn của f-string hiện có
2 bình luận
t-stringsmới của PythonPEP 750 – Chuỗi mẫu (t-strings) đã được phê duyệt
Ý kiến Hacker News
Nhìn chung, tính năng này khá hay. Về cơ bản, nó biến đoạn mã như sau
thành
Có một câu hỏi là liệu lớp "đường" cú pháp này có đủ lợi ích để biện minh cho sự phức tạp của một tính năng ngôn ngữ mới hay không. Tôi nghĩ là có trong trường hợp này vì hai lý do
Tôi cũng hy vọng hệ sinh thái công cụ sẽ thích nghi để hỗ trợ t-strings. Ví dụ, sẽ rất tốt nếu black và ruff có thể định dạng nội dung t-string, và vscode có thể tô màu các kiểu nội dung phổ biến như HTML hoặc SQL
sql”select * from {table}”có thể làm được việc này, nhưng cũng không có gì đảm bảo rằng nội dung trong template sẽ được hàm chuyển đổi biến thành SQL hợp lệ.t“give me {table} but only {columns}”vẫn có thể được chuyển thành SQL hợp lệ sau khi template được xử lýCó thể dùng cú pháp SQL gọn gàng như sau không?
Nếu hàm
db.get()chấp nhận template thì có thể. Đây sẽ là cách dùng SQL gọn gàng nhất mà tôi từng thấy cho đến nayCá nhân tôi thấy tính năng này tập trung quá nhiều vào một vấn đề cụ thể để trở thành tính năng phổ dụng. Python đang ngày càng phình to. Khi người ta hỏi liệu Python có dễ học và đơn giản không, tôi phải trả lời rằng "phần cơ bản thì có, nhưng để học toàn bộ ngôn ngữ thì không"
Cuộc thảo luận lớn (414 điểm, 10 ngày trước, 324 bình luận) liên kết
Khá hay. Nếu đang port các tính năng từ JS, liệu tiếp theo chúng ta có thể có dictionary unpacking/destructuring không?
Việc chỉ tích hợp sẵn tính năng x-string mới khiến nó có cảm giác như một "mánh". Sẽ rất hay nếu có thể làm như thế này
Zen of Python năm 2025:
Định dạng chuỗi trong Python năm 2025:
Tôi không hiểu nó khác gì so với việc áp dụng hàm lên biến trong f-string. Vậy nên thay vì:
tại sao không đơn giản làm thế này:
Hoặc làm trước khi tạo f-string. Chỉ là để bạn không quên phần làm sạch/thao tác chuỗi và buộc phải đi qua bước đó thôi sao?
Xin chào! Tôi là người đã viết bài này :-)