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 value từ 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 Interpolation theo 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 Template mới kết hợp các chuỗi và phép nội suy từ cả hai mẫu.

Đưa ra:

TypeError -- nếu other không phải là Template

Nối mẫu với str bị 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("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")

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: &lt;script&gt;alert('xss')&lt;/script&gt;"

Xem thêm