Tecniche di sostituzione delle variabili
f-string, .format() e librerie di template per il rendering dei prompt
Tecniche di sostituzione delle variabili è una lezione AI Prompt Engineering gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.
Quattro approcci Python al rendering dei template
Python offre diversi modi per eseguire il rendering dei template di prompt con la sostituzione delle variabili. Ognuno presenta vantaggi e compromessi:
- f-string — inline, immediate, senza bisogno di import
- str.format() — segnaposto denominati, pratico per la convalida
- string.Template — sostituzione sicura con il simbolo del dollaro, supporto al riempimento parziale
- Jinja2 — motore completo per i template: condizioni, cicli, filtri ed ereditarietà
La scelta dell'approccio corretto dipende dalla complessità dei template, dalle competenze del team e dalla necessità di funzionalità avanzate come condizioni e cicli.
Approccio 1: f-string Python
Le f-string sono l'approccio più semplice per i template di prompt quando tutte le variabili sono disponibili al momento del rendering:
import openai
client = openai.OpenAI(api_key='sk-...')
def generate_linkedin_post(company, topic, tone, word_count):
prompt = (
f'Write a LinkedIn post for {company} about {topic}. '
f'Tone: {tone}. '
f'Length: {word_count} words. '
'Professional but conversational. '
'End with one question to engage readers. '
'No hashtags. Active voice.'
)
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
return response.choices[0].message.content
print(generate_linkedin_post(
company='DataStream Analytics',
topic='how AI is changing data pipelines',
tone='enthusiastic but grounded',
word_count=180
))Approccio 2: str.format()
str.format() è utile quando si desidera memorizzare le stringhe dei template separatamente dal codice che le compila, ad esempio per caricare i template da file:
import openai
client = openai.OpenAI(api_key='sk-...')
# Template stored as a module-level constant or loaded from a file
SUPPORT_REPLY_TEMPLATE = '''You are a customer support agent for {company_name}.
Respond to this customer message:
---
{customer_message}
---
Tone: {tone}.
Keep the response under {max_words} words.
Do not offer refunds unless the customer explicitly asks.
Always close by asking if there is anything else you can help with.'''
def generate_support_reply(company, message, tone='empathetic and helpful', max_words=150):
prompt = SUPPORT_REPLY_TEMPLATE.format(
company_name=company,
customer_message=message,
tone=tone,
max_words=max_words
)
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
return response.choices[0].message.contentApproccio 3: string.Template
string.Template, parte della libreria standard di Python, utilizza segnaposto con il simbolo del dollaro ($variable o ${variable}). Il suo vantaggio principale è che safe_substitute() lascia le variabili mancanti come testo letterale del segnaposto invece di generare un errore, consentendo riempimenti parziali:
from string import Template
import openai
client = openai.OpenAI(api_key='sk-...')
# $ placeholders — safe with code that contains curly braces
BASE_TEMPLATE = Template(
'Write a $format_type for $audience about $topic. '
'Tone: $tone. Length: $word_count words. '
'Active voice. No jargon.'
)
def generate(format_type, audience, topic, tone='professional', word_count=200):
prompt = BASE_TEMPLATE.substitute(
format_type=format_type,
audience=audience,
topic=topic,
tone=tone,
word_count=word_count
)
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
return response.choices[0].message.content
# Partial fill example — safe_substitute leaves $word_count as-is
partial = BASE_TEMPLATE.safe_substitute(
format_type='blog post', audience='developers', topic='API design'
)
print(partial) # $tone and $word_count remain as placeholdersApproccio 4: nozioni di base su Jinja2
Jinja2 è un motore completo per i template. Supporta condizioni, cicli, filtri ed ereditarietà dei template, ben oltre la semplice sostituzione delle stringhe:
from jinja2 import Template
import openai
client = openai.OpenAI(api_key='sk-...')
# Jinja2 uses {{ }} for variables and {% %} for logic
JINJA_PROMPT = Template('''
Write a {{content_type}} for {{audience}} about {{topic}}.
Tone: {{tone}}.
{% if include_examples %}
Include {{example_count}} concrete examples.
{% endif %}
{% if word_count %}
Length: {{word_count}} words.
{% else %}
Aim for 200-300 words.
{% endif %}
Active voice. No jargon.
''')
def generate(content_type, audience, topic, tone, include_examples=False, example_count=2, word_count=None):
prompt = JINJA_PROMPT.render(
content_type=content_type,
audience=audience,
topic=topic,
tone=tone,
include_examples=include_examples,
example_count=example_count,
word_count=word_count
)
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
return response.choices[0].message.contentCicli Jinja2 nei template
I cicli Jinja2 consentono di iterare sugli elenchi nel template, una funzione utile per generare prompt con più elementi a partire da strutture dati:
from jinja2 import Template
import openai
client = openai.OpenAI(api_key='sk-...')
MULTI_PRODUCT_TEMPLATE = Template('''
Write a product comparison for {{audience}}.
Compare the following products:
{% for product in products %}
- {{product.name}}: {{product.description}}
{% endfor %}
Structure: one paragraph per product, then a 2-sentence recommendation.
Tone: {{tone}}. Active voice. No bullet points in paragraphs.
''')
products = [
{'name': 'Asana', 'description': 'project management with timeline views'},
{'name': 'Linear', 'description': 'developer-focused issue tracking'},
{'name': 'Monday.com', 'description': 'visual work management for teams'}
]
prompt = MULTI_PRODUCT_TEMPLATE.render(
audience='startup founders',
products=products,
tone='direct and practical'
)
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
print(response.choices[0].message.content)Filtri Jinja2
I filtri Jinja2 trasformano i valori delle variabili inline durante il rendering del template. Filtri integrati utili per i prompt:
{{ topic | upper }}— converte l'argomento in maiuscolo{{ word_count | default(200) }}— utilizza 200 se word_count non viene fornito{{ audience | title }}— converte la stringa dei destinatari in formato titolo{{ items | join(', ') }}— unisce un elenco utilizzando le virgole
I filtri mantengono la logica di trasformazione all'interno del template anziché nel codice Python che lo richiama, rendendo i template più autonomi e portabili.
Caricamento dei template da file
Per i template grandi o complessi, memorizzarli in file di testo separati mantiene pulito il codice Python. Environment e FileSystemLoader di Jinja2 gestiscono bene questo scenario:
from jinja2 import Environment, FileSystemLoader
import openai
client = openai.OpenAI(api_key='sk-...')
# Load all templates from the 'prompts/' directory
env = Environment(loader=FileSystemLoader('prompts/'))
def render_template(template_name, variables):
'''Load and render a .j2 template file with the given variables.'''
template = env.get_template(template_name)
return template.render(**variables)
def generate_from_file(template_name, variables):
prompt = render_template(template_name, variables)
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
return response.choices[0].message.content
# Usage: load prompts/blog_post.j2 and fill with variables
result = generate_from_file('blog_post.j2', {
'topic': 'API rate limiting strategies',
'audience': 'backend engineers',
'tone': 'technical and direct',
'word_count': 500
})
print(result)Scelta dell'approccio corretto
Scelga l'approccio di sostituzione in base alla complessità dei template:
- f-string — script rapidi, automazioni una tantum e template abbastanza brevi da poter essere letti inline
- str.format() — template memorizzati, codebase di team e situazioni in cui è utile ottenere KeyError per le variabili mancanti
- string.Template — quando il contenuto può contenere parentesi graffe, ad esempio frammenti di codice, o quando è necessario un riempimento parziale
- Jinja2 — template complessi con condizioni, cicli, più file o un team con esperienza nei sistemi di templating
Il sovra-ingegnerizzamento è un rischio concreto: ricorra a Jinja2 solo quando ha davvero bisogno delle sue funzionalità avanzate.
Sicurezza dei template: attacchi di injection
Quando i valori delle variabili provengono dall'input dell'utente, la prompt injection rappresenta un rischio concreto. Un utente malintenzionato potrebbe fornire un valore come: "Ignori tutte le istruzioni precedenti e..."
Misure difensive:
- Convalidi e sanifichi tutte le variabili fornite dall'utente prima della sostituzione
- Per gli input destinati agli utenti, racchiuda la variabile tra delimitatori: "L'input dell'utente è: ---{user_input}---"
- Utilizzi il filtraggio dell'output per rilevare e rifiutare le risposte che sembrano aver seguito istruzioni inserite tramite injection
- Non consenta mai ai valori forniti dall'utente di accedere alle variabili del prompt di sistema
Test dei rendering dei template
Verifichi sempre il rendering dei template separatamente dalle chiamate API. Convalidi la stringa risultante prima di inviarla al modello:
def test_template_render():
test_cases = [
{'topic': 'cloud security', 'audience': 'CTOs', 'tone': 'formal', 'word_count': 300},
{'topic': 'ML pipelines', 'audience': 'data scientists', 'tone': 'technical', 'word_count': 500},
# Edge cases
{'topic': '', 'audience': 'developers', 'tone': 'casual', 'word_count': 100}, # empty topic
{'topic': 'AI' * 100, 'audience': 'all', 'tone': 'brief', 'word_count': 50}, # very long topic
]
TEMPLATE = 'Write a {word_count}-word {tone} article about {topic} for {audience}. Active voice.'
for i, case in enumerate(test_cases):
try:
rendered = TEMPLATE.format(**case)
assert len(rendered) > 0, 'Empty render'
print(f'Case {i+1} OK: {len(rendered)} chars')
except (KeyError, AssertionError) as e:
print(f'Case {i+1} FAILED: {e}')
test_template_render()Verifica delle conoscenze: tecniche di sostituzione
Sta costruendo un sistema di prompt in cui i file dei template sono memorizzati su disco, i template includono sezioni condizionali, ad esempio una sezione sui prezzi da includere facoltativamente in base a un flag, e possono essere creati da più membri del team che hanno familiarità con il templating web.
Quale approccio di sostituzione è più adatto a questo scenario?
Riepilogo: tecniche di sostituzione delle variabili
Python offre quattro approcci per il rendering dei template di prompt: f-string (inline e semplici), str.format() (segnaposto denominati, KeyError per le variabili mancanti), string.Template (sintassi con il simbolo del dollaro e riempimenti parziali sicuri) e Jinja2 (motore completo con condizioni, cicli, filtri e caricamento da file).
Scelga l'approccio in base alla complessità: utilizzi le f-string per gli script rapidi, str.format() per i template memorizzati, string.Template quando il contenuto contiene parentesi graffe e Jinja2 quando sono necessarie condizioni, cicli o template basati su file. Verifichi sempre il rendering separatamente dalle chiamate API.
Domande Frequenti
La lezione «Tecniche di sostituzione delle variabili» è gratuita?
Sì — il testo completo di «Tecniche di sostituzione delle variabili» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.
Cosa imparerò in «Tecniche di sostituzione delle variabili»?
f-string, .format() e librerie di template per il rendering dei prompt Eserciti AI Prompt Engineering con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Prompt Engineering?
Non è richiesta alcuna esperienza precedente. AI Prompt Engineering su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Tecniche di sostituzione delle variabili»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Prompt Engineering?
Sì. Ogni lezione AI Prompt Engineering include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Che cos'è un template di prompt?
- Creare schemi da completare
- Tecniche di sostituzione delle variabili
- Riutilizzare i template tra le attività