В Подвижном многие расширения переносят свою строку справки/синтаксиса в вызов к функции подчеркивания, как так:
_('[OPTION] [QUEUE]')
Это смущает меня, потому что это не кажется необходимым (инструкции по Расширениям Записи не упоминают это) и, кажется, нет _ определен в классе, таким образом, я задаюсь вопросом, является ли это некоторым специальным синтаксисом, который я не понимаю, возможно, другой способ сказать лямбду или возможно тождественное отображение? Дополнительно я задаюсь вопросом, что преимущество этой методологии (независимо от того, что это) закончено просто, необработанная строка как документация предлагает.
Ничто, что я видел в документации Python, не упоминает такую функцию, таким образом, я не уверен, является ли это действительно вопросом о Python или Подвижным вопросом.
Вот два примера, которые используют эту структуру (взгляд на cmdtable
словарь около нижней части файла)
Посмотрите строку 45:
from mercurial.i18n import _
Это обычное сокращение в пакете интернационализации gettext и, возможно, в других пакетах, для функции, которая возвращает перевод своего аргумент языка, на котором в настоящее время выполняется программа. Для удобства он сокращен до _
, поскольку используется практически для каждого сообщения, отображаемого пользователю.
Похоже, Mercurial оборачивает его в свой собственный модуль. («i18n» означает «интернационализация», потому что между «i» и «n» 18 букв.)
_
(имя функции с одним подчеркиванием) часто ассоциируется с интернационализацией из-за прецедента gettext
, подхода GNU, который также нашел место в стандартной библиотеке Python (та же архитектура, совершенно другая реализация) - согласно документации модуля,
gettext.install(domain[, localedir[, unicode[, codeset[, names]]]])
Это устанавливает функцию
_()
во встроенные имена Python. пространство имен Python builtins, основанное на домен, localedir и codeset, которые передаются в функцию translation(). Флаг юникода передается полученному переводу в метод install() полученного объекта.О параметре names см. описание метода translation метода install() объекта translation.
Как показано ниже, вы обычно помечаете строки в вашем приложении, которые являются кандидатами на перевод, путем обернув их в вызов функции
_()
, например, так:
print _('This string will be translated.')
Для удобства вы хотите, чтобы функция
_()
была установлена в пространство имен Python builtins, чтобы она была чтобы она была легко доступна во всех модулях вашего приложения.
Как упоминает @ptomato, Mercurial последовал этой традиции, назвав _
эквивалентной функцией свою собственную, которую они используют для тех же целей интернационализации.
Существует также отдельная традиция использовать _
в качестве идентификатора "мне все равно", как в
fee, fie, _, _, foo, _, fum = thesevenitemstuple
но, конечно, вам лучше не использовать обе традиции сразу в одном коде; -)
.