Обзор проблемы:
В основном скрипте моего проекта gettext
устанавливает функцию _()
, которая используется в других модулях для переводов (например, в print(_('Something to translate'))
).
Как указано в документе:
функция _() [установлена] в пространстве имен встроенных функций Python, поэтому она легко доступна во всех модулях вашего приложения.
Итак, все работает нормально.
Единственная проблема: flake8
показывает ошибки (фактически возвращенные PyFlakes):
$ flake8 *.py
lib.py:2:12: F821 undefined name '_'
main_script.py:8:7: F821 undefined name '_'
Это нормально, так как _
действительно не определен ни в main_script.py, ни в lib.py.
Простая структура, которая воспроизводит проблему:
.
├── lib.py
├── locale
│ └── de
│ └── LC_MESSAGES
│ ├── myapp.mo
│ └── myapp.po
└── main_script.py
Где lib.py содержит это:
def fct(sentence):
return _(sentence)
и main_script.py это:
#!/usr/bin/env python3
import gettext
import lib
gettext.translation('myapp', 'locale', ['de']).install()
print(_('A sentence'))
print(lib.fct('A sentence'))
и myapp.po содержит:
msgid ""
msgstr ""
"Project-Id-Version: myapp\n"
msgid "A sentence"
msgstr "Ein Satz"
(был скомпилирован poedit для создания файла mo).
Как указано выше, основной скрипт работает:
$ ./main_script.py
Ein Satz
Ein Satz
Важное примечание: я ищу решение, работающее как для сценария, в котором gettext.install()
вызывается , так и для всех других модулей, которым не нужно вызывать gettext.install()
. strong> В противном случае структура может быть еще более простой, потому что вызова _()
из main_script.py достаточно, чтобы вызвать F821.
Решения для решения ситуации, которые выглядят плохо (или хуже):
- добавьте комментарий
# noqa
в конце каждой строки, используя_()
--ignore
F821 (не хочу этого делать, потому что это полезно в других ситуациях)
--builtins="_"
, что является более конкретным, чем--ignore F821
. - person Anonymous   schedule 15.06.2016_
в качестве ярлыка перевода, я наконец решил отказаться от этого. Я заменил_
наtr
и импортирую его в любое время, как и для любого другого модуля. - person zezollo   schedule 25.04.2020