string.templatelib — תמיכה ב-Template String#

מודול זה מספק תמיכה ב-template strings (t-strings) כפי שמוגדר ב-PEP 750. Template strings נוצרים באמצעות הקידומת t ומספקים גישה הן לחלקי המחרוזת המילוליים והן לערכים המשולבים לפני שהם מצורפים.

זמינות: Template strings אינם נתמכים על מצלמות OpenMV Cam המבוססות STM32. הם זמינים רק על מצלמות OpenMV Cam המבוססות Alif ו-i.MX RT.

מחלקות#

class string.templatelib.Template(*args)#

מייצג template string. אובייקטי Template נוצרים בדרך כלל על ידי תחביר t-string (t"...") אך ניתן גם לבנותם ישירות באמצעות הבנאי.

strings#

tuple של ליטרלים של מחרוזת המופיעים בין שילובים.

interpolations#

tuple של אובייקטי Interpolation המייצגים את הביטויים המשולבים.

values#

תכונה לקריאה בלבד המחזירה tuple המכיל את התכונה value מכל שילוב בתבנית.

__iter__() Iterator#

מבצע איטרציה על תוכן התבנית, ומניב חלקי מחרוזת ואובייקטי Interpolation בסדר שבו הם מופיעים. מחרוזות ריקות מושמטות.

__add__(other: Template) Template#

משרשר שתי תבניות. מחזיר Template חדש המשלב את המחרוזות והשילובים משתי התבניות.

מעלה:

TypeError – אם other אינו Template

שרשור תבנית עם str אסור כדי להימנע מעמימות לגבי האם יש להתייחס למחרוזת כליטרל או כשילוב:

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

מייצג ביטוי משולב בתוך template string. ניתן להעביר את כל הארגומנטים כארגומנטי מילת מפתח.

value#

הערך המוערך של הביטוי המשולב.

expression#

ייצוג המחרוזת של הביטוי כפי שהופיע ב-template string.

conversion#

מציין ההמרה ('s' או 'r') אם קיים, אחרת None. שימו לב ש-MicroPython אינו תומך בהמרת 'a'.

format_spec#

מחרוזת מפרט הפורמט אם קיימת, אחרת מחרוזת ריקה.

תחביר Template String#

Template strings משתמשים באותו תחביר כמו f-strings אך עם קידומת t

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

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

מציינֵי המרה#

Template strings מאחסנים מציינֵי המרה כ-metadata. בניגוד ל-f-strings, ההמרה אינה מיושמת באופן אוטומטי:

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

קוד העיבוד חייב ליישם המרות במפורש בעת הצורך.

מפרטי פורמט#

מפרטי פורמט מאוחסנים כ-metadata באובייקט ה-Interpolation. בניגוד ל-f-strings, הפורמט אינו מיושם באופן אוטומטי:

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

לפי PEP 750, קוד העיבוד אינו נדרש להשתמש במפרטי פורמט, אך כשהם קיימים יש לכבד אותם ולהתאים להתנהגות f-string היכן שאפשר.

פורמט Debug#

פורמט ה-debug {expr=} נתמך:

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

חשוב

כפי שב-PEP 750, בניגוד ל-f-strings, template strings אינם מיישמים אוטומטית המרות או מפרטי פורמט. זאת בכוונת תחילה כדי לאפשר לקוד העיבוד לשלוט באופן הטיפול בהם. קוד העיבוד חייב לטפל בתכונות אלה במפורש.

MicroPython אינו מספק את הפונקציה המובנית format(). השתמשו במתודות פורמט מחרוזת כמו str.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)

עיבוד תבנית עם תמיכת פורמט:

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"

דוגמת בריחת 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;"

ראו גם#