Modul string.templatelib --- Dukungan Template String

Modul ini menyediakan dukungan untuk template string (t-string) sebagaimana didefinisikan dalam PEP 750. Template string dibuat menggunakan awalan t dan menyediakan akses ke bagian string literal maupun nilai yang diinterpolasi sebelum keduanya digabungkan.

Ketersediaan: Template string tidak didukung pada OpenMV Cam berbasis STM32. Tersedia hanya pada OpenMV Cam berbasis Alif dan i.MX RT.

Kelas

class string.templatelib.Template(*args)

Mewakili template string. Objek Template biasanya dibuat dengan sintaks t-string (t"...") tetapi juga dapat dikonstruksi secara langsung menggunakan konstruktor.

strings

Tuple dari literal string yang muncul di antara interpolasi.

interpolations

Tuple dari objek Interpolation yang mewakili ekspresi yang diinterpolasi.

values

Properti hanya-baca yang mengembalikan tuple berisi atribut value dari setiap interpolasi dalam template.

__iter__() Iterator

Iterasi atas konten template, menghasilkan bagian string dan objek Interpolation sesuai urutan kemunculannya. String kosong dihilangkan.

__add__(other: Template) Template

Menggabungkan dua template. Mengembalikan Template baru yang menggabungkan string dan interpolasi dari kedua template.

Pengecualian:

TypeError -- jika other bukan Template

Penggabungan template dengan str dilarang untuk menghindari ambiguitas tentang apakah string harus diperlakukan sebagai literal atau interpolasi:

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 = '')

Mewakili ekspresi yang diinterpolasi dalam template string. Semua argumen dapat diteruskan sebagai argumen kata kunci.

value

Nilai yang dievaluasi dari ekspresi yang diinterpolasi.

expression

Representasi string dari ekspresi sebagaimana muncul dalam template string.

conversion

Penentu konversi ('s' atau 'r') jika ada, jika tidak None. Perhatikan bahwa MicroPython tidak mendukung konversi 'a'.

format_spec

String spesifikasi format jika ada, jika tidak string kosong.

Sintaks Template String

Template string menggunakan sintaks yang sama dengan f-string tetapi dengan awalan t

name = "World"
template = t"Hello {name}!"

# Access template components
print(template.strings)        # ('Hello ', '!')
print(template.values)         # ('World',)
print(template.interpolations[0].expression)  # 'name'

Penentu Konversi

Template string menyimpan penentu konversi sebagai metadata. Tidak seperti f-string, konversi tidak diterapkan secara otomatis:

value = "test"
t = t"{value!r}"
# t.interpolations[0].value == "test" (not repr(value))
# t.interpolations[0].conversion == "r"

Kode pemrosesan harus secara eksplisit menerapkan konversi bila diperlukan.

Spesifikasi Format

Spesifikasi format disimpan sebagai metadata dalam objek Interpolation. Tidak seperti f-string, pemformatan tidak diterapkan secara otomatis:

pi = 3.14159
t = t"{pi:.2f}"
# t.interpolations[0].value == 3.14159 (not formatted)
# t.interpolations[0].format_spec == ".2f"

Sesuai PEP 750, kode pemrosesan tidak diwajibkan menggunakan spesifikasi format, tetapi jika ada, spesifikasi tersebut harus dihormati dan perilakunya harus sesuai dengan f-string bila memungkinkan.

Format Debug

Format debug {expr=} didukung:

x = 42
t = t"{x=}"
# t.strings == ("x=", "")
# t.interpolations[0].expression == "x"
# t.interpolations[0].conversion == "r"

Penting

Sesuai PEP 750, tidak seperti f-string, template string tidak secara otomatis menerapkan konversi atau spesifikasi format. Ini dirancang demikian agar kode pemrosesan dapat mengontrol cara penanganannya. Kode pemrosesan harus secara eksplisit menangani atribut-atribut ini.

MicroPython tidak menyediakan fungsi bawaan format(). Gunakan metode pemformatan string seperti str.format() sebagai gantinya.

Contoh Penggunaan

Pemrosesan dasar tanpa dukungan format:

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)

Pemrosesan template dengan dukungan format:

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"

Contoh HTML escaping:

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;"

Lihat Juga