2010-06-19 20 views
5

In Mercurial, molte delle estensioni di avvolgere il loro stringa di aiuto/sintassi in una chiamata a una funzione di sottolineatura, in questo modo:Mercurial/Python - Cosa fa la funzione Underscore?

_('[OPTION] [QUEUE]') 

Questo mi confonde, perché non sembra necessario (le istruzioni Writing Extensions non lo fanno menzionarlo) e non sembra esserci un _ definito nella classe, quindi mi chiedo se questa è una sintassi speciale che non capisco, forse un altro modo per dire lambda, o forse la funzione di identità? Inoltre mi chiedo quale sia il vantaggio di questa metodologia (qualunque essa sia) rispetto alla semplice stringa grezza, come suggerisce la documentazione.

Nulla di ciò che ho visto nella documentazione di Python menziona tale funzione, quindi non sono sicuro che si tratti di una domanda Python o di una domanda Mercurial.

Ecco due esempi che utilizzano questa struttura (guardare il cmdtable dizionario vicino alla parte inferiore del file)

risposta

8

sguardo on line 45:

from mercurial.i18n import _ 

Questo è il solito abb revisione nel pacchetto di internazionalizzazione gettext, e possibilmente anche altri pacchetti, per la funzione che restituisce una traduzione del suo argomento nella lingua in cui è attualmente in esecuzione il programma. È abbreviato in _ per comodità, dal momento che è utilizzato per quasi tutti i messaggi visualizzati l'utente.

Sembra che Mercurial lo avvolga nel proprio modulo. ("I18n" significa "internazionalizzazione", perché ci sono 18 lettere tra "i" e "n".)

+0

Ahaha! Ok grazie! Quindi questo è per comodità se qualcuno volesse eseguirlo nella propria lingua, ma dovrebbero comunque fornire/impegnare le proprie traduzioni, giusto? Se uso gettext non mi aspetto di fornire il mio, giusto? – dimo414

+0

@ dimo414, con 'gettext' della libreria standard (e con GNU per le altre lingue), sei _definitamente_ ci si aspetta che fornisca le tue traduzioni - ciò che il codice' gettext' fa è recuperare e usare quelle frasi tradotte, sicuramente ** non fa la traduzione automatica automatica tra diverse lingue naturali !!! –

+0

@Alex, mi dispiace non essere stato chiaro: la domanda riguardava le aspettative, non la funzionalità. Dal punto di vista del "fornire un programma completato", mi sono aspettato di creare personalmente queste traduzioni, oppure è giusto che io rilasci il codice senza di loro? – dimo414

6

_ (un nome di funzione di un singolo trattino) è spesso associato con internazionalizzazione, dovuta al precedente della gettext, un approccio GNU che ha anche trovato un posto nella libreria standard di Python (stessa architettura, completamente diversa implementazione) - per the module's docs,

gettext.install(domain[, localedir[, unicode[, codeset[, names]]]]) 

Questo consente di installare la funzione _() in di Python builtins namespace, sulla base di dominio, localedi r e codeset che sono passati alla funzione translation(). Il flag unicode è passato al metodo di installazione ( oggetto di conversione risultante().

Per il parametro nomi, vedere la descrizione del metodo di installazione() dell'oggetto .

Come si vede qui sotto, di solito segnano i stringhe nell'applicazione che sono candidati per la traduzione, per avvolgendoli in una chiamata alla funzione _() , in questo modo:

print _('This string will be translated.') 

Per comodità, è necessario la funzione _() da installare nello spazio dei nomi builtin di Python, quindi è facilmente accessibile in tutti i moduli di l'applicazione.

Come @ptomato menziona, Mercurial ha seguito questa tradizione nominando _ funzione equivalente della propria che usano per gli stessi scopi internazionalizzazione.

C'è anche una tradizione separata da utilizzare _ come il "non mi interessa" identificativo, come in

fee, fie, _, _, foo, _, fum = thesevenitemstuple 

ma ovviamente è meglio non sarei usando entrambe le tradizioni in una sola volta nella stessa codice ;-)

+1

Intendevi "la libreria standard di Python", giusto? – tonfa

+0

@tonfa, sì - aggiustando, grazie. –

+0

+1 per spiegare il funzionamento interno di .install() – BlackVegetable