string.templatelib --- Hỗ trợ Template String¶
Mô-đun này cung cấp hỗ trợ cho các chuỗi mẫu (t-string) được định nghĩa trong PEP 750. Các chuỗi mẫu được tạo bằng tiền tố t và cung cấp quyền truy cập vào cả các phần chuỗi ký tự và các giá trị được nội suy trước khi chúng được kết hợp.
Tính khả dụng: Các chuỗi mẫu không được hỗ trợ trên OpenMV Cams dựa trên STM32. Chúng chỉ có sẵn trên OpenMV Cams dựa trên Alif và i.MX RT.
Lớp¶
- class string.templatelib.Template(*args)¶
Đại diện cho một chuỗi mẫu. Các đối tượng Template thường được tạo bằng cú pháp t-string (
t"...") nhưng cũng có thể được xây dựng trực tiếp bằng constructor.- strings¶
Một tuple các chuỗi ký tự xuất hiện giữa các nội suy.
- interpolations¶
Một tuple các đối tượng
Interpolationđại diện cho các biểu thức được nội suy.
- values¶
Thuộc tính chỉ đọc trả về một tuple chứa thuộc tính
valuetừ mỗi phép nội suy trong mẫu.
- __iter__() Iterator¶
Duyệt qua nội dung mẫu, trả lần lượt các phần chuỗi và các đối tượng
Interpolationtheo thứ tự chúng xuất hiện. Các chuỗi rỗng bị bỏ qua.
- __add__(other: Template) Template¶
Nối hai mẫu. Trả về một
Templatemới kết hợp các chuỗi và phép nội suy từ cả hai mẫu.Nối mẫu với
strbị cấm để tránh sự mơ hồ về việc chuỗi nên được xử lý như chuỗi ký tự hay phép nội suy:t1 = t"Hello " t2 = t"World" result = t1 + t2 # Valid # TypeError: cannot concatenate str to Template result = t1 + "World"
- class string.templatelib.Interpolation(value: Any, expression: str = '', conversion: str | None = None, format_spec: str = '')¶
Đại diện cho một biểu thức được nội suy trong một chuỗi mẫu. Tất cả các đối số có thể được truyền dưới dạng đối số từ khóa.
- value¶
Giá trị đã được đánh giá của biểu thức được nội suy.
- expression¶
Biểu diễn chuỗi của biểu thức như nó xuất hiện trong chuỗi mẫu.
- conversion¶
Bộ chỉ định chuyển đổi (
's'hoặc'r') nếu có, ngược lại làNone. Lưu ý rằng MicroPython không hỗ trợ chuyển đổi'a'.
- format_spec¶
Chuỗi đặc tả định dạng nếu có, ngược lại là chuỗi rỗng.
Cú pháp Template String¶
Các chuỗi mẫu sử dụng cú pháp giống như f-string nhưng với tiền tố t
name = "World"
template = t"Hello {name}!"
# Access template components
print(template.strings) # ('Hello ', '!')
print(template.values) # ('World',)
print(template.interpolations[0].expression) # 'name'
Bộ chỉ định chuyển đổi¶
Các chuỗi mẫu lưu trữ bộ chỉ định chuyển đổi dưới dạng metadata. Khác với f-string, phép chuyển đổi không được áp dụng tự động:
value = "test"
t = t"{value!r}"
# t.interpolations[0].value == "test" (not repr(value))
# t.interpolations[0].conversion == "r"
Mã xử lý phải áp dụng rõ ràng các phép chuyển đổi khi cần.
Đặc tả định dạng¶
Các đặc tả định dạng được lưu trữ dưới dạng metadata trong đối tượng Interpolation. Khác với f-string, định dạng không được áp dụng tự động:
pi = 3.14159
t = t"{pi:.2f}"
# t.interpolations[0].value == 3.14159 (not formatted)
# t.interpolations[0].format_spec == ".2f"
Theo PEP 750, mã xử lý không bắt buộc phải sử dụng các đặc tả định dạng, nhưng khi có mặt chúng nên được tôn trọng và khớp với hành vi của f-string khi có thể.
Định dạng gỡ lỗi¶
Định dạng gỡ lỗi {expr=} được hỗ trợ:
x = 42
t = t"{x=}"
# t.strings == ("x=", "")
# t.interpolations[0].expression == "x"
# t.interpolations[0].conversion == "r"
Quan trọng
Theo PEP 750, khác với f-string, các chuỗi mẫu không tự động áp dụng các phép chuyển đổi hay đặc tả định dạng. Đây là thiết kế có chủ đích để cho phép mã xử lý kiểm soát cách xử lý các thuộc tính này. Mã xử lý phải xử lý rõ ràng các thuộc tính này.
MicroPython không cung cấp hàm tích hợp format(). Hãy sử dụng các phương thức định dạng chuỗi như str.format() thay thế.
Ví dụ sử dụng¶
Xử lý cơ bản không hỗ trợ định dạng:
def simple_process(template):
"""Simple template processing"""
parts = []
for item in template:
if isinstance(item, str):
parts.append(item)
else:
parts.append(str(item.value))
return "".join(parts)
Xử lý mẫu có hỗ trợ định dạng:
from string.templatelib import Template, Interpolation
def convert(value, conversion):
"""Apply conversion specifier to value"""
if conversion == "r":
return repr(value)
elif conversion == "s":
return str(value)
return value
def process_template(template):
"""Process template with conversion and format support"""
result = []
for part in template:
if isinstance(part, str):
result.append(part)
else: # Interpolation
value = convert(part.value, part.conversion)
if part.format_spec:
# Apply format specification using str.format
value = ("{:" + part.format_spec + "}").format(value)
else:
value = str(value)
result.append(value)
return "".join(result)
pi = 3.14159
name = "Alice"
t = t"{name!r}: {pi:.2f}"
print(process_template(t))
# Output: "'Alice': 3.14"
# Other format specifications work too
value = 42
print(process_template(t"{value:>10}")) # " 42"
print(process_template(t"{value:04d}")) # "0042"
Ví dụ thoát HTML:
def html_escape(value):
"""Escape HTML special characters"""
if not isinstance(value, str):
value = str(value)
return value.replace("&", "&").replace("<", "<").replace(">", ">")
def safe_html(template):
"""Convert template to HTML-safe string"""
result = []
for part in template:
if isinstance(part, str):
result.append(part)
else:
result.append(html_escape(part.value))
return "".join(result)
user_input = "<script>alert('xss')</script>"
t = t"User said: {user_input}"
print(safe_html(t))
# Output: "User said: <script>alert('xss')</script>"
Xem thêm¶
PEP 750 - Đặc tả Template Strings
Format string syntax - Cú pháp chuỗi định dạng
Formatted string literals - f-string trong Python