{"id":2294,"date":"2025-09-14T13:25:54","date_gmt":"2025-09-14T13:25:54","guid":{"rendered":"https:\/\/davidka.net\/uk\/?p=2294"},"modified":"2025-09-22T02:59:49","modified_gmt":"2025-09-22T00:59:49","slug":"f-strings","status":"publish","type":"post","link":"https:\/\/it.davidka.net\/it\/f-strings\/","title":{"rendered":"Funzionalit\u00e0 meno note delle f-string che potresti non conoscere"},"content":{"rendered":"\n<p class=\"has-neve-link-color-color has-text-color has-link-color has-medium-font-size wp-elements-d00463301af7e12b54c5b193809b2b1d wp-block-paragraph\">Le f-string sono un modo moderno e molto comodo per incorporare valori di variabili ed espressioni direttamente nel testo di una stringa. Per creare una f-string, \u00e8 sufficiente anteporre una\u00a0<code class=\"\" data-line=\"\">f<\/code>\u00a0prima delle virgolette di apertura. All&#8217;interno della stringa, \u00e8 possibile inserire variabili racchiudendole tra parentesi graffe\u00a0<code class=\"\" data-line=\"\">{}<\/code>, e Python sostituir\u00e0 automaticamente\u00a0<code class=\"\" data-line=\"\">{variabile}<\/code>\u00a0con il suo valore.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">&lt;em&gt;# Creiamo due variabili con valori numerici.&lt;\/em&gt;\nuno = 1\ndue = 2\n\n&lt;em&gt;# Inseriamo i valori delle variabili &#039;uno&#039; e &#039;due&#039; nella stringa.&lt;\/em&gt;\nf&quot;{uno}, {due}&quot;\n&lt;em&gt;# Output: &#039;1, 2&#039;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La potenza delle f-string risiede nella loro capacit\u00e0 di contenere non solo variabili, ma quasi ogni espressione Python valida all&#8217;interno delle parentesi graffe. Ci\u00f2 consente di eseguire calcoli al volo senza creare variabili intermedie non necessarie.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">&lt;em&gt;# Eseguiamo un&#039;addizione direttamente all&#039;interno della f-string.&lt;\/em&gt;\nf&quot;{uno} + {due} = {uno + due}&quot;\n&lt;em&gt;# Output: &#039;1 + 2 = 3&#039;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c8 possibile accedere facilmente agli elementi di strutture dati come dizionari (tramite chiave) e liste (tramite indice) da una f-string. Questo si estende anche all&#8217;accesso agli attributi degli oggetti (usando la notazione punto) e persino alla chiamata di funzioni.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">&lt;em&gt;# Accesso al valore di un dizionario tramite la sua chiave.&lt;\/em&gt;\ncolori = {&quot;rosso&quot;: &quot;#ff0000&quot;, &quot;verde&quot;: &quot;#00ff00&quot;}\nf&quot;Il colore rosso \u00e8 {colori&#091;&#039;rosso&#039;]}&quot;\n&lt;em&gt;# Output: &#039;Il colore rosso \u00e8 #ff0000&#039;&lt;\/em&gt;\n\n&lt;em&gt;# Accesso agli elementi di una lista tramite il loro indice.&lt;\/em&gt;\ndati = &#091;4, 8, 15, 16, 23, 42]\nf&quot;I numeri migliori: {dati&#091;4]} e {dati&#091;5]}&quot;\n&lt;em&gt;# Output: &#039;I numeri migliori: 23 e 42&#039;&lt;\/em&gt;\n\n&lt;em&gt;# Accesso agli attributi di un oggetto e chiamata di funzioni.&lt;\/em&gt;\nfrom dataclasses import dataclass\n@dataclass\nclass Punto:\n    x: int\n    y: int\npos = Punto(23, 42)\nf&quot;Posizione: {pos.x}, {pos.y}. Il valore pi\u00f9 grande \u00e8 {max(pos.x, pos.y)}.&quot;\n&lt;em&gt;# Output: &#039;Posizione: 23, 42. Il valore pi\u00f9 grande \u00e8 42.&#039;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div id=\"rtoc-mokuji-wrapper\" class=\"rtoc-mokuji-content frame2 preset1 animation-fade rtoc_open default\" data-id=\"2294\" data-theme=\"Neve - Davidka\">\n\t\t\t<div id=\"rtoc-mokuji-title\" class=\"rtoc_btn_none rtoc_left\">\n\t\t\t\n\t\t\t<span>In Questo Articolo<\/span>\n\t\t\t<\/div><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#usare-le-f-string-per-il-debug\">Usare le f-string per il debug<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#stampare-la-rappresentazione-di-debug-repr\">Stampare la rappresentazione di debug (repr)<\/a><\/li><li class=\"rtoc-item\"><a href=\"#riempimento-allineamento-e-troncamento\">Riempimento, allineamento e troncamento<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rappresentazioni-numeriche\">Rappresentazioni numeriche<\/a><\/li><li class=\"rtoc-item\"><a href=\"#argomenti-aggiuntivi-e-buone-pratiche\">Argomenti aggiuntivi e buone pratiche<\/a><\/li><li class=\"rtoc-item\"><a href=\"#consigli-pratici-e-possibili-insidie\">Consigli pratici e possibili insidie<\/a><ul class=\"rtoc-mokuji mokuji_none level-3\"><li class=\"rtoc-item\"><a href=\"#leggibilit\u00e0-vs-brevit\u00e0\">Leggibilit\u00e0 vs. brevit\u00e0<\/a><\/li><li class=\"rtoc-item\"><a href=\"#f-string-su-pi\u00f9-righe\">F-string su pi\u00f9 righe<\/a><\/li><li class=\"rtoc-item\"><a href=\"#questioni-di-sicurezza-molto-importante\">Questioni di sicurezza (Molto importante!)<\/a><\/li><li class=\"rtoc-item\"><a href=\"#prestazioni-perch\u00e9-le-f-string-sono-cos\u00ec-veloci\">Prestazioni: perch\u00e9 le f-string sono cos\u00ec veloci?<\/a><\/li><li class=\"rtoc-item\"><a href=\"#strumenti-di-migrazione\">Strumenti di migrazione<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ol><\/div><h3 class=\"wp-block-heading\" id=\"usare-le-f-string-per-il-debug\">Usare le f-string per il debug<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A partire da Python 3.8, le f-string includono un potente strumento per il debug rapido. Aggiungendo un segno di uguale (<code class=\"\" data-line=\"\">=<\/code>) dopo una variabile o un&#8217;espressione all&#8217;interno delle parentesi graffe, si indica a Python di stampare non solo il valore, ma anche l&#8217;espressione stessa. Questo \u00e8 incredibilmente utile per ispezionare rapidamente il codice.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from datetime import date, timedelta\nutente = &quot;eric_idle&quot;\nmembro_dal = date(1975, 7, 31)\ndelta = date(2022, 4, 11) - membro_dal\n\n&lt;em&gt;# Usa f&quot;{utente=}&quot; per ottenere automaticamente &quot;utente=&#039;eric_idle&#039;&quot;.&lt;\/em&gt;\nf&quot;{utente=} {membro_dal=}&quot;\n&lt;em&gt;# Output: &quot;utente=&#039;eric_idle&#039; membro_dal=datetime.date(1975, 7, 31)&quot;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Questo specificatore di debug pu\u00f2 essere combinato con specificatori di formattazione regolari. \u00c8 anche possibile utilizzarlo su intere espressioni per mostrare chiaramente sia il calcolo che il suo risultato.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">&lt;em&gt;# = mostra il nome della variabile, : inizia la formattazione, ,d formatta come intero con separatore di migliaia.&lt;\/em&gt;\nf&quot;{delta.days=:,d}&quot;\n&lt;em&gt;# Output: &#039;delta.days=17,056&#039;&lt;\/em&gt;\n\n&lt;em&gt;# Mostra sia l&#039;input che il risultato di un calcolo.&lt;\/em&gt;\nfrom math import cos, radians\ntheta = 30\nf&quot;{theta=} {cos(radians(theta))=:.3f}&quot;\n&lt;em&gt;# Output: &#039;theta=30 cos(radians(theta))=0.866&#039;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"stampare-la-rappresentazione-di-debug-repr\">Stampare la rappresentazione di debug (repr)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Gli oggetti Python hanno due rappresentazioni di stringa:&nbsp;<code class=\"\" data-line=\"\">str()<\/code>&nbsp;(per un output di facile lettura per l&#8217;utente) e&nbsp;<code class=\"\" data-line=\"\">repr()<\/code>&nbsp;(per un output non ambiguo, destinato allo sviluppatore). Per impostazione predefinita, le f-string utilizzano&nbsp;<code class=\"\" data-line=\"\">str()<\/code>. Per ottenere l&#8217;output di&nbsp;<code class=\"\" data-line=\"\">repr()<\/code>, \u00e8 possibile utilizzare il flag di conversione&nbsp;<code class=\"\" data-line=\"\">!r<\/code>, che \u00e8 una comoda scorciatoia per chiamare&nbsp;<code class=\"\" data-line=\"\">repr()<\/code>&nbsp;manualmente. Il flag&nbsp;<code class=\"\" data-line=\"\">!s<\/code>&nbsp;chiama esplicitamente&nbsp;<code class=\"\" data-line=\"\">str()<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">class Dato:\n    def __repr__(self): return &#039;&lt;Dato ...&gt;&#039; &lt;em&gt;# Rappresentazione di debug&lt;\/em&gt;\n    def __str__(self): return &#039;rappresentazione di stringa&#039; &lt;em&gt;# Rappresentazione per l&#039;utente&lt;\/em&gt;\ndato = Dato()\n\n&lt;em&gt;# Il comportamento predefinito chiama str(dato)&lt;\/em&gt;\nf&quot;dato: {dato}&quot;\n&lt;em&gt;# Output: &#039;dato: rappresentazione di stringa&#039;&lt;\/em&gt;\n\n&lt;em&gt;# Usando il flag !r si chiama repr(dato)&lt;\/em&gt;\nf&quot;dato: {dato!r}&quot;\n&lt;em&gt;# Output: &#039;dato: &lt;Dato ...&gt;&#039;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"riempimento-allineamento-e-troncamento\">Riempimento, allineamento e troncamento<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Le f-string offrono un controllo completo sulla formattazione dell&#8217;output, inclusa la larghezza del campo, l&#8217;allineamento e i caratteri di riempimento. Lo specificatore di formato viene posto dopo i due punti (<code class=\"\" data-line=\"\">:<\/code>).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">&gt;<\/code>\u00a0allinea il testo a destra.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">&lt;<\/code>\u00a0allinea il testo a sinistra.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">^<\/code>\u00a0centra il testo.<\/li>\n\n\n\n<li>Un numero dopo il carattere di allineamento specifica la larghezza totale del campo.<\/li>\n\n\n\n<li>Un carattere prima del carattere di allineamento specifica il carattere di riempimento.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">val = &quot;test&quot;\n\n&lt;em&gt;# Allinea a destra in un campo di 10 caratteri&lt;\/em&gt;\nf&quot;{val:&gt;10}&quot;\n&lt;em&gt;# Output: &#039;      test&#039;&lt;\/em&gt;\n\n&lt;em&gt;# Allinea a sinistra e riempi lo spazio vuoto con &#039;_&#039;&lt;\/em&gt;\nf&quot;{val:_&lt;10}&quot;\n&lt;em&gt;# Output: &#039;test______&#039;&lt;\/em&gt;\n\n&lt;em&gt;# Centra il testo&lt;\/em&gt;\nf&quot;{val:^10}&quot;\n&lt;em&gt;# Output: &#039;   test   &#039;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Per troncare una stringa a una lunghezza massima, si usa la sintassi&nbsp;<code class=\"\" data-line=\"\">:.N<\/code>, dove N \u00e8 il numero di caratteri.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">strumento = &quot;xylophone&quot;\n&lt;em&gt;# Tronca la stringa a 5 caratteri.&lt;\/em&gt;\nf&quot;{strumento:.5}&quot;\n&lt;em&gt;# Output: &#039;xylop&#039;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"rappresentazioni-numeriche\">Rappresentazioni numeriche<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sono disponibili numerose opzioni di formattazione per i numeri. \u00c8 possibile convertire facilmente i numeri in binario (<code class=\"\" data-line=\"\">b<\/code>), ottale (<code class=\"\" data-line=\"\">o<\/code>) o esadecimale (<code class=\"\" data-line=\"\">x<\/code>\/<code class=\"\" data-line=\"\">X<\/code>). L&#8217;uso di un&nbsp;<code class=\"\" data-line=\"\">#<\/code>&nbsp;aggiunge il prefisso appropriato (<code class=\"\" data-line=\"\">0b<\/code>,&nbsp;<code class=\"\" data-line=\"\">0o<\/code>,&nbsp;<code class=\"\" data-line=\"\">0x<\/code>).<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">risposta = 42\n\n&lt;em&gt;# Rappresentazione esadecimale&lt;\/em&gt;\nf&quot;{risposta:x}, {risposta:X}&quot;\n&lt;em&gt;# Output: &#039;2a, 2A&#039;&lt;\/em&gt;\n\n&lt;em&gt;# Con un prefisso&lt;\/em&gt;\nf&quot;{risposta:#x}&quot;\n&lt;em&gt;# Output: &#039;0x2a&#039;&lt;\/em&gt;\n\n&lt;em&gt;# Notazione scientifica&lt;\/em&gt;\nf&quot;{risposta ** 8:e}&quot;\n&lt;em&gt;# Output: &#039;9.682652e+12&#039;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il riempimento dei numeri con zeri iniziali si ottiene usando&nbsp;<code class=\"\" data-line=\"\">0<\/code>&nbsp;come carattere di riempimento. Per i numeri in virgola mobile, \u00e8 possibile controllare sia la larghezza totale che il numero di cifre decimali. \u00c8 anche possibile controllare la visualizzazione del segno e aggiungere separatori di migliaia.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">&lt;em&gt;# Riempi fino a 4 cifre con zeri iniziali&lt;\/em&gt;\nf&quot;{risposta:04d}&quot;\n&lt;em&gt;# Output: &#039;0042&#039;&lt;\/em&gt;\n\n&lt;em&gt;# Per Pi greco: larghezza totale 6, 2 cifre decimali, riempimento con zeri&lt;\/em&gt;\nimport math\nf&quot;{math.pi:06.2f}&quot;\n&lt;em&gt;# Output: &#039;003.14&#039;&lt;\/em&gt;\n\n&lt;em&gt;# Mostra sempre il segno (+ per i positivi, - per i negativi)&lt;\/em&gt;\nf&quot;{risposta:+d}&quot;\n&lt;em&gt;# Output: &#039;+42&#039;&lt;\/em&gt;\n\n&lt;em&gt;# Usa la virgola come separatore di migliaia&lt;\/em&gt;\nnum = 1234567890\nf&quot;{num:,d}&quot;\n&lt;em&gt;# Output: &#039;1,234,567,890&#039;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"argomenti-aggiuntivi-e-buone-pratiche\">Argomenti aggiuntivi e buone pratiche<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Molti oggetti integrati, come&nbsp;<code class=\"\" data-line=\"\">datetime<\/code>, hanno il loro mini-linguaggio di formattazione che funziona direttamente all&#8217;interno delle f-string.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">from datetime import datetime\ndt = datetime(2022, 4, 11, 13, 37)\n&lt;em&gt;# Usa i codici di formattazione standard per data\/ora&lt;\/em&gt;\nf&quot;{dt:%Y-%m-%d %H:%M}&quot;\n&lt;em&gt;# Output: &#039;2022-04-11 13:37&#039;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Gli specificatori di formato stessi non devono essere statici! \u00c8 possibile impostarli dinamicamente usando variabili con parentesi graffe annidate.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">&lt;em&gt;# Larghezza e allineamento sono impostati da variabili&lt;\/em&gt;\nvalore = &quot;test&quot;\nallineamento = &quot;^&quot;\nlarghezza = 10\n&lt;em&gt;# f&#039;{valore:{allineamento}{larghezza}}&#039; prima diventa f&#039;{valore:^10}&#039;&lt;\/em&gt;\nf&#039;{valore:{allineamento}{larghezza}}&#039;\n&lt;em&gt;# Output: &#039;   test   &#039;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Se hai bisogno di includere una parentesi graffa letterale&nbsp;<code class=\"\" data-line=\"\">{<\/code>&nbsp;o&nbsp;<code class=\"\" data-line=\"\">}<\/code>&nbsp;nella tua stringa, \u00e8 sufficiente raddoppiarla.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">f&quot;Parentesi graffe letterali: {{valore}}&quot;\n&lt;em&gt;# Output: &#039;Parentesi graffe letterali: {valore}&#039;&lt;\/em&gt;\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"consigli-pratici-e-possibili-insidie\">Consigli pratici e possibili insidie<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"leggibilit\u00e0-vs-brevit\u00e0\">Leggibilit\u00e0 vs. brevit\u00e0<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Le f-string consentono di incorporare espressioni molto complesse, ma non \u00e8 sempre una buona idea. Un principio fondamentale di Python \u00e8 la leggibilit\u00e0 del codice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cattiva pratica (difficile da leggere):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">&lt;em&gt;# Tecnicamente funziona, ma cosa sta succedendo qui?&lt;\/em&gt;\nprint(f&quot;Risultato: {round(&#091;user.height for user in users if user.active]&#091;0] \/ 2.54, 2)} pollici.&quot;)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Buona pratica (separare la logica dalla presentazione):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">&lt;em&gt;# 1. Prima, prepariamo i dati&lt;\/em&gt;\naltezze_utenti_attivi = &#091;user.height for user in users if user.active]\naltezza_primo_utente_cm = altezze_utenti_attivi&#091;0]\naltezza_in_pollici = round(altezza_primo_utente_cm \/ 2.54, 2)\n\n&lt;em&gt;# 2. Poi, formattiamo il risultato&lt;\/em&gt;\nprint(f&quot;Risultato: {altezza_in_pollici} pollici.&quot;)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il codice \u00e8 pi\u00f9 lungo, ma ora \u00e8 comprensibile, testabile e facile da modificare.&nbsp;<strong>Una regola generale: se un&#8217;espressione all&#8217;interno di&nbsp;<code class=\"\" data-line=\"\">{}<\/code>&nbsp;\u00e8 pi\u00f9 lunga di 20-30 caratteri o contiene una logica complessa, \u00e8 meglio estrarla in una variabile separata.<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"f-string-su-pi\u00f9-righe\">F-string su pi\u00f9 righe<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Per stringhe lunghe o per generare testo su pi\u00f9 righe (ad es. query SQL, template HTML), usa le virgolette triple. Anche le espressioni al loro interno possono estendersi su pi\u00f9 righe.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">utente = &quot;hypo69&quot;\npermessi = &#091;&#039;read&#039;, &#039;write&#039;, &#039;execute&#039;]\n\n&lt;em&gt;# L&#039;espressione all&#039;interno della f-string \u00e8 suddivisa su pi\u00f9 righe per leggibilit\u00e0&lt;\/em&gt;\nreport = f&quot;&quot;&quot;\nReport Utente: {utente.upper()}\n----------------------------------\nPermessi: {&#039;, &#039;.join(p for p in permessi\n                            if p != &#039;execute&#039;)}\n&quot;&quot;&quot;\nprint(report)\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"questioni-di-sicurezza-molto-importante\">Questioni di sicurezza (Molto importante!)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Le f-string di per s\u00e9 sono sicure. Un&#8217;espressione come&nbsp;<code class=\"\" data-line=\"\">f&quot;Ciao, {nome}&quot;<\/code>&nbsp;non \u00e8 una vulnerabilit\u00e0; Python prende semplicemente la rappresentazione di stringa di&nbsp;<code class=\"\" data-line=\"\">nome<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Il pericolo sorge quando si combinano le f-string con funzioni che eseguono codice, come&nbsp;<code class=\"\" data-line=\"\">eval()<\/code>.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>CODICE ESTREMAMENTE PERICOLOSO \u2014 NON FARLO MAI:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">import os\ntemplate_utente = input(&quot;Inserisci un template: &quot;) &lt;em&gt;# L&#039;utente inserisce: &#039;{os.system(&quot;reboot&quot;)}&#039;&lt;\/em&gt;\neval(f&#039;f&quot;{template_utente}&quot;&#039;)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Se un utente inserisce&nbsp;<code class=\"\" data-line=\"\">{os.system(&quot;reboot&quot;)}<\/code>, il tuo server si riavvier\u00e0. Questa \u00e8 una vulnerabilit\u00e0 di Esecuzione di Codice Remoto (RCE).&nbsp;<strong>Non passare mai stringhe fornite dall&#8217;utente a funzioni come&nbsp;<code class=\"\" data-line=\"\">eval()<\/code>, nemmeno tramite f-string.<\/strong>&nbsp;Per template definiti dall&#8217;utente, usa motori di templating sicuri come Jinja2.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"prestazioni-perch\u00e9-le-f-string-sono-cos\u00ec-veloci\">Prestazioni: perch\u00e9 le f-string sono cos\u00ec veloci?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Una f-string non \u00e8 una chiamata di funzione; \u00e8 parte della sintassi di Python. Il compilatore analizza la f-string e la suddivide in parti letterali ed espressioni da valutare. Questo viene compilato in un bytecode altamente efficiente che costruisce la stringa finale in un&#8217;unica operazione veloce. \u00c8 molto pi\u00f9 veloce del metodo&nbsp;<code class=\"\" data-line=\"\">.format()<\/code>, che deve analizzare la stringa di formato a runtime.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"strumenti-di-migrazione\">Strumenti di migrazione<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Strumenti come&nbsp;<strong><code class=\"\" data-line=\"\">flynt<\/code><\/strong>&nbsp;e&nbsp;<strong><code class=\"\" data-line=\"\">pyupgrade<\/code><\/strong>&nbsp;possono convertire automaticamente codice datato che usa&nbsp;<code class=\"\" data-line=\"\">.format()<\/code>&nbsp;e&nbsp;<code class=\"\" data-line=\"\">%<\/code>&nbsp;in moderne f-string, il che \u00e8 un ottimo modo per modernizzare rapidamente una codebase legacy.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le f-string sono un modo moderno e molto comodo per incorporare valori di variabili ed espressioni direttamente nel testo di una stringa. Per creare una f-string, \u00e8 sufficiente anteporre una\u00a0f\u00a0prima delle virgolette di apertura. All&#8217;interno della stringa, \u00e8 possibile inserire variabili racchiudendole tra parentesi graffe\u00a0{}, e Python sostituir\u00e0 automaticamente\u00a0{variabile}\u00a0con il suo valore.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"on","neve_post_elements_order":"[\"content\",\"tags\",\"comments\"]","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[384],"tags":[851,835],"class_list":["post-2294","post","type-post","status-publish","format-standard","hentry","category-python-cheat-sheets","tag-tag-f-strings","tag-tag-python"],"acf":[],"_links":{"self":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/2294","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/comments?post=2294"}],"version-history":[{"count":0,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/2294\/revisions"}],"wp:attachment":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/media?parent=2294"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/categories?post=2294"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/tags?post=2294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}