Mercurial / Python - Что делает функция подчеркивания? - PullRequest
6 голосов
/ 20 июня 2010

В Mercurial многие расширения переносят свою строку справки / синтаксиса в вызов функции подчеркивания, например:

 _('[OPTION] [QUEUE]')

Это смущает меня, потому что это не кажется необходимым (инструкции Writing Extensions не упоминают об этом) и, кажется, в классе не определено _, поэтому мне интересно если это какой-то особый синтаксис, который я не понимаю, возможно, другой способ сказать лямбду, или, возможно, функцию тождества? Кроме того, мне интересно, какая польза от этой методологии (какой бы она ни была) над простой строкой, как предполагает документация.

Ничто из того, что я видел в документации по Python, не упоминает о такой функции, поэтому я не уверен, действительно ли это вопрос Python или вопрос Mercurial.

Вот два примера, которые используют эту структуру (посмотрите словарь cmdtable в нижней части файла)

Ответы [ 2 ]

8 голосов
/ 20 июня 2010

Посмотрите на строке 45:

from mercurial.i18n import _

Это обычное сокращение в пакете интернационализации gettext и, возможно, в других пакетах для функции, которая возвращает перевод своего аргумента.на язык, на котором в данный момент работает программа. Для удобства он сокращен до _, поскольку он используется практически для каждого сообщения, отображаемого пользователю.

Похоже, Mercurial упаковывает его в свой собственный модуль.(«i18n» означает «интернационализация», потому что между «i» и «n» 18 букв).

7 голосов
/ 20 июня 2010

_ (имя функции единственного подчеркивания) часто ассоциируется с интернационализацией из-за прецедента gettext, подхода GNU, который также нашел место в стандартной библиотеке Python (та же архитектура, совершенно другая реализация) - за документы модуля ,

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

Это устанавливает функцию _() во встроенном пространстве имен Python, основанном на домене, localedir и наборе кодов, которые передаются вфункция перевода ().Флаг Юникода передается в метод install () результирующего объекта перевода.

Параметр names см. В описании метода install () объекта перевода.

Как видно ниже, выобычно отмечают строки в вашем приложении, которые являются кандидатами на перевод, заключая их в вызов функции _(), например:

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

Для удобства вы хотите, чтобы_() функция, которая будет установлена ​​во встроенном пространстве имен Python, поэтому она легко доступна во всех модулях вашего приложения.

Как упоминает @ptomato, Mercurial следовал этой традиции, называя _ эквивалентомсвою собственную функцию, которую они используют для тех же целей интернационализации.

Существует также отдельная традиция использовать _ в качестве идентификатора "Мне все равно", как в

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

но, конечно, лучше не использовать обе традиции одновременно в одном коде; -)

...