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חדש המשלב את המחרוזות והשילובים משתי התבניות.שרשור תבנית עם
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("&", "&").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>"
ראו גם¶
PEP 750 - מפרט Template Strings
Format string syntax - תחביר מחרוזת פורמט
Formatted string literals - f-strings ב-Python