string.templatelib — Mallimerkkijonojen tuki

Tämä moduuli tarjoaa tuen mallimerkkijonoille (t-stringit), jotka on määritelty kohdassa PEP 750. Mallimerkkijonot luodaan käyttäen t-etuliitettä, ja ne tarjoavat pääsyn sekä merkkijonon kirjaimellisiin osiin että interpoloituihin arvoihin ennen niiden yhdistämistä.

Saatavuus: Mallimerkkijonoja ei tueta STM32-pohjaisilla OpenMV Cam -laitteilla. Ne ovat saatavilla vain Alif- ja i.MX RT -pohjaisilla OpenMV Cam -laitteilla.

Luokat

class string.templatelib.Template(*args)

Edustaa mallimerkkijonoa. Template-objektit luodaan tyypillisesti t-string-syntaksilla (t"..."), mutta ne voidaan myös rakentaa suoraan konstruktorin avulla.

strings

Monikko merkkijonokirjaimista, jotka esiintyvät interpolointien välissä.

interpolations

Monikko Interpolation-objekteista, jotka edustavat interpoloituja lausekkeita.

values

Vain luettava ominaisuus, joka palauttaa monikon, joka sisältää value-attribuutin mallin jokaisesta interpoloinnista.

__iter__() Iterator

Iteroi mallin sisällön läpi tuottaen merkkijono-osat ja Interpolation-objektit siinä järjestyksessä, jossa ne esiintyvät. Tyhjät merkkijonot jätetään pois.

__add__(other: Template) Template

Yhdistä kaksi mallia. Palauttaa uuden Template-objektin, joka yhdistää merkkijonot ja interpoloinnit molemmista malleista.

Nostaa:

TypeError – jos other ei ole Template

Mallin yhdistäminen str-tyypin kanssa on kielletty epäselvyyden välttämiseksi siitä, tulisiko merkkijonoa käsitellä kirjaimellisena vai interpolointina:

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

Edustaa mallimerkkijonon sisällä olevaa interpoloitua lauseketta. Kaikki argumentit voidaan välittää avainsana-argumentteina.

value

Interpoloidun lausekkeen laskettu arvo.

expression

Lausekkeen merkkijonoesitys sellaisena kuin se esiintyi mallimerkkijonossa.

conversion

Muunnosmäärite ('s' tai 'r'), jos sellainen on annettu, muutoin None. Huomaa, että MicroPython ei tue 'a'-muunnosta.

format_spec

Muotoilumäärittelyn merkkijono, jos sellainen on annettu, muutoin tyhjä merkkijono.

Mallimerkkijonon syntaksi

Mallimerkkijonot käyttävät samaa syntaksia kuin f-stringit, mutta t-etuliitteellä:

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

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

Muunnosmääritteet

Mallimerkkijonot tallentavat muunnosmääritteet metatietoina. Toisin kuin f-stringeissä, muunnosta ei sovelleta automaattisesti:

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

Käsittelykoodin on sovellettava muunnoksia eksplisiittisesti tarvittaessa.

Muotoilumäärittelyt

Muotoilumäärittelyt tallennetaan metatietoina Interpolation-objektiin. Toisin kuin f-stringeissä, muotoilua ei sovelleta automaattisesti:

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

PEP 750:n mukaan käsittelykoodin ei tarvitse käyttää muotoilumäärittelyjä, mutta kun niitä on annettu, niitä tulisi noudattaa ja vastata f-stringien käyttäytymistä mahdollisuuksien mukaan.

Vianjäljitysmuoto

Vianjäljitysmuotoa {expr=} tuetaan:

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

Tärkeää

PEP 750:n mukaisesti, toisin kuin f-stringit, mallimerkkijonot eivät sovella muunnoksia tai muotoilumäärittelyjä automaattisesti. Tämä on suunniteltu niin, jotta käsittelykoodi voi hallita sitä, miten näitä käsitellään. Käsittelykoodin on käsiteltävä nämä attribuutit eksplisiittisesti.

MicroPython ei tarjoa sisäänrakennettua format()-funktiota. Käytä sen sijaan merkkijonon muotoilumetodeja, kuten str.format().

Esimerkkikäyttö

Peruskäsittely ilman muotoilutukea:

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)

Mallin käsittely muotoilutuella:

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-koodinvaihdon esimerkki:

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

Katso myös