2015-06-01 4 views
13

Perchè è una tupla (o dict) obbligatorio per l'uso con una stringa di formato:Perché un elenco non è consentito con le stringhe di formato?

"%s %d" % ("text", 42) 

Quale sarebbe lo svantaggio dei seguenti?

"%s %d" % ["text", 42] 
+1

Poiché la sintassi è stata [definito per utilizzare una tupla o un oggetto di mapping] (https://docs.python.org/2/library/stdtypes .html # string-formattazione-operazioni).La stessa ragione per cui non useresti virgolette per definire un letterale intero. Molto bene avrebbero potuto usare le liste ma perché dovrebbe? –

+9

Buona domanda. Non lo so, ma sospetto che abbia a che fare con la mutabilità delle liste – inspectorG4dget

+0

Nessuna spiegazione fornita in [la fonte] (https://github.com/python-git/python/blob/master/Objects/stringobject. C# L4614). Immagino che la ragione sia "perché richiederebbe una quantità non banale di lavoro da implementare, e non abbastanza persone lo vogliono" – Kevin

risposta

1

sto cercando di indovinare, ma mi aspetto che sia perché GvR ha voluto ridurre al minimo il numero di tipi diversi T per i quali 'my object is: %s' % T(...) fallisce. E 'già abbastanza grave che non riesce per namedtuple s ;-)

Vale a dire, consentendo '%s %s' % [1,2] crea una trappola in più per gli incauti, perché impedisce che si formattazione [1,2] stesso con il formato %s.

-1

Molto probabilmente l'utilizzo di una tupla nella formattazione di una stringa consiste nel risolvere le ambiguità. Cioè, supponiamo di avere un oggetto immutabile come una lista o un dict, questi oggetti potrebbero cambiare in futuro e quindi la formattazione potrebbe fallire o potrebbe non essere formattata come previsto! In effetti, l'uso di una tupla è molto più chiaro dell'uso di una lista, perché una tupla non può essere cambiata in-palace come una lista.

Ad esempio, si consideri il seguente codice:

T = ("spam", "ham") 

s = "%s and %s" % T 

poiché l'oggetto a sinistra è una tupla, è possibile assicurarsi che questo non sarà mai essere cambiato sul posto da un'operazione quando il programma viene eseguito e così si può avere una pace della mente su questo. Tuttavia, per non dire che usare le tuple è completamente sicuro dato che puoi fare qualcosa come T += ("holy cow",) e quindi aggiungerai un terzo elemento alla tua tupla che renderà l'espressione errata. Le tuple però hanno meno probabilità di cambiare rispetto alle liste perché sono oggetti immutabili. Un elenco può essere modificato ovunque e chissà dove e quando quell'elenco potrebbe cambiare in un programma di milioni di righe?

Avviso che cosa accade quando usiamo le liste invece qui:

L = ["spam", "ham"] 
L.append("Ice-cream")  #line 103984.. above "%s and %s" % L 

s = "%s and %s" % L    #Error, three values in L 

Si potrebbe pensare che L contiene solo "spam" e "ham", ma anzi L contiene un altro oggetto che è stato aggiunto da un'operazione quando il programma ha funzionato. Potresti rilevare tu stesso questo errore in un sistema più piccolo, ma pensa se l'elenco L sia stato utilizzato per la conservazione dello stato tra le funzioni in un sistema gigantesco, in che modo puoi conoscere il suo valore o le modifiche che potrebbero verificarsi? Ancora peggio, è possibile passare a s una funzione per elaborare la stringa formattata in un determinato modo, la funzione qui non funzionerà immediatamente se dipende da un determinato formato di stringa. E se non eccetto uno specifico formato di stringa, può elaborare l'operazione che hai intenzione di capovolgere.

Questo può essere ambiguo in quanto è necessario tracciare tutti i codici; certamente questo è un compito noioso nei grandi sistemi. Le liste non sono protette dai cambiamenti, è il contrario, devi cambiare e manipolare le liste come faresti. poiché l'elenco può essere modificato di volta in volta, Python utilizza solo una tupla nell'espressione di formattazione per non consentire questa confusione. Generalmente, le tuple sono un tipo di elenco, ma sono costanti, non è possibile cambiarle sul posto. questo semplifica letteralmente l'operazione di debug di un programma.

+0

Penso che il punto che si ottiene cambiando la lista tra inizializzazione e utilizzo sia valido. Purtroppo ci sono molti altri aspetti che hanno poco a che fare con la domanda o sono confusi ... – steffen

+0

Considera la nuova modifica. – direprobs

0

tuple sono più veloci per l'accesso di liste, il che lo rende il default

+0

importa davvero? Dopotutto, stiamo formattando le stringhe, che non è mai veloce, cioè non dovrebbe mai essere fatto in un codice critico. Inoltre, di solito lo si fa con 1 a 10 elementi nella tupla. – steffen

Problemi correlati