2016-01-05 20 views
9

Sto sviluppando un'applicazione in cui eseguo alcune richieste per ottenere un ID oggetto. Dopo ognuno di essi, chiamo un metodo (get_actor_info()) che passa questo id come argomento (vedi il codice sotto).Formattazione stringa Python:% vs concatenazione

ACTOR_CACHE_KEY_PREFIX = 'actor_' 

def get_actor_info(actor_id): 
    cache_key = ACTOR_CACHE_KEY_PREFIX + str(actor_id) 

Come si può notare, sto gettando actor_id-string e concatenando con un prefisso. Tuttavia, so che potrei farlo in molti altri modi (.format() o '%s%d', ad esempio) e questo si traduce nella mia domanda: '%s%d' sarebbe meglio della concatenazione di stringhe in termini di leggibilità, convenzione di codice ed efficienza?

Grazie

+0

È possibile controllare da soli: https://docs.python.org/2/library/timeit.html –

+1

Grazie a @brunodesthuilliers! Tuttavia questo risponde solo alla parte dell'efficienza temporale della domanda. –

+2

Sì scusa ... wrt/leggibilità e convenzioni, la risposta è semplice: usa '.format()'. –

risposta

9

Questo potrebbe facilmente diventare un thread basato su opinioni, ma trovo la formattazione più leggibile nella maggior parte dei casi e più gestibile. È più facile visualizzare come sarà la stringa finale, senza fare "concatenazione mentale". Quale di questi è più leggibile, per esempio?

errorString = "Exception occurred ({}) while executing '{}': {}".format(
    e.__class__.__name__, task.name, str(e) 
) 

Oppure:

errorString = "Exception occurred (" + e.__class__.__name__ 
    + ") while executing '" + task.name + "': " + str(e) 

Per quanto riguarda se utilizzare o %.format(), posso rispondere con maggiore obiettività: Usa .format(). % è il "vecchio stile", e, per la Python Documentation che potrebbe presto essere rimossi:

Dal str.format() è abbastanza nuovo, un sacco di codice Python utilizza ancora l'operatore %. Tuttavia, poiché questo vecchio stile di formattazione verrà rimosso dalla lingua, in genere dovrebbe essere utilizzato str.format().

Le versioni successive della documentazione hanno smesso di menzionarlo, ma comunque, .format() è la via del futuro; usalo!

La concatenazione è più veloce, ma non dovrebbe essere un problema. Rendi il tuo codice leggibile e gestibile come obiettivo di prima linea, quindi ottimizza le parti che devi ottimizzare in seguito. ottimizzazione prematura è la radice di tutti i mali;)

4

concatenazione è migliore quando si tratta di prestazioni. Nel tuo esempio, sia la concatenazione che la sostituzione sono leggibili, ma quando si tratta di modelli più complessi, la sostituzione vince la semplicità e la leggibilità.

Ad esempio, se si dispone di dati e si desidera visualizzarli in html, la concatenazione causerà mal di testa, mentre la sostituzione sarà semplice e leggibile.

+0

La concatenazione è * peggio * quando si tratta di prestazioni. Vedi https: // waymoot.org/home/python_string/e http://leadsift.com/python-string-concatenation/ – jalanb

2

Python 3.6 introdurrà ancora un'altra opzione:

ACTOR_CACHE_KEY_PREFIX = 'actor_' 

def get_actor_info(actor_id): 
    cache_key = f'{ACTOR_CACHE_KEY_PREFIX}{actor_id}' 

prestazioni dovrebbero essere paragonabili a '{}{}'.format(ACTOR_CACHE_KEY_PREFIX, actor_id), ma è probabilmente più leggibile.