2010-06-19 5 views
5

En Mercurial, bon nombre des extensions enveloppent leur chaîne aide/syntaxe dans un appel à une fonction underscore, comme ceci:Mercurial/Python - Que fait la fonction Underscore?

_('[OPTION] [QUEUE]') 

Cela me confond, car il ne semble pas nécessaire (les instructions Writing Extensions ne le font pas mentionnez-le) et il ne semble pas y avoir de _ défini dans la classe, donc je me demande si c'est une syntaxe particulière que je ne comprends pas, peut-être une autre façon de dire lambda, ou peut-être la fonction identité? De plus, je me demande quel est le bénéfice de cette méthodologie (quelle qu'elle soit) sur la chaîne brute comme le suggère la documentation. Rien de ce que j'ai vu dans la documentation de Python ne mentionne une telle fonction, donc je ne suis pas sûr que ce soit vraiment une question Python ou une question Mercurial.

Voici deux exemples qui utilisent cette structure (regardez le dictionnaire cmdtable près du fond du fichier)

Répondre

8

Look en ligne 45:

from mercurial.i18n import _ 

Ceci est l'abb habituel reviation dans le paquet d'internationalisation gettext, et éventuellement d'autres paquets aussi, pour la fonction qui renvoie une traduction de son argument au langage dans lequel le programme s'exécute actuellement. Il est abrégé en _ pour plus de commodité, puisqu'il est utilisé pour à peu près tous les messages affichés l'utilisateur.

On dirait que Mercurial l'enveloppe dans son propre module. ("i18n" signifie "internationalisation" car il y a 18 lettres entre "i" et "n".)

+0

Ahaha! D'accord, merci! Donc, c'est par commodité si quelqu'un voulait le faire fonctionner dans sa propre langue - mais il devrait quand même fournir/commettre ses propres traductions, n'est-ce pas? Si j'utilise gettext je ne suis pas censé fournir le mien, non? – dimo414

+0

@ dimo414, avec le 'gettext' de la librairie standard (et avec GNU's pour les autres langages), vous êtes _definitely_ censé fournir vos propres traductions - ce que fait le code de' gettext' est de récupérer et d'utiliser ces expressions traduites, il est certain que ** ne fait pas ** la traduction automatique automatique parmi les différentes langues naturelles !!! –

+0

@Alex, désolé je n'étais pas clair - la question était sur les attentes, pas la fonctionnalité. D'un point de vue «fournir un programme achevé», est-ce que je m'attendrais à créer moi-même ces traductions, ou est-ce que je suis d'accord pour que je libère du code sans eux? – dimo414

6

_ (un nom de fonction d'un seul trait de soulignement) est souvent associé à l'internationalisation, en raison du précédent de gettext, une approche GNU qui a également trouvé une place dans la bibliothèque standard de Python (même architecture, la mise en œuvre complètement différente) - par the module's docs,

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

Cette installe la fonction _() dans espace de noms builtins de Python, basé sur domaine, localedi r, et le jeu de codes sont passés à la fonction translation(). L'indicateur unicode est transmis à la traduction résultante méthode install() de l'objet.

Pour le paramètre names, veuillez voir la description de la traduction de la méthode install() de l'objet .

Comme on le voit ci-dessous, vous marquez généralement les chaînes dans votre application qui sont candidats pour la traduction, par les envelopper dans un appel à la fonction _() , comme ceci:

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

Pour plus de commodité, vous voulez que la fonction _() soit installée dans l'espace de noms de Python, donc est facilement accessible dans tous les modules de votre application.

Comme @ptomato mentionne, Mercurial a suivi cette tradition en nommant _ la fonction équivalente de leur propre qu'ils utilisent pour les mêmes fins d'internationalisation.

Il y a aussi une tradition distincte pour utiliser _ comme identifiant « Je ne me soucie pas », comme dans

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

mais bien sûr, vous feriez mieux de ne pas être d'utiliser les deux traditions à la fois dans le même code ;-)

+1

Vous vouliez dire "bibliothèque standard de Python", non? – tonfa

+0

@tonfa, yep - la fixation, merci. –

+0

+1 pour expliquer le fonctionnement interne de .install() – BlackVegetable