问题概述:
在我项目的主脚本中,gettext
安装_()
在其他模块中用于翻译的函数(如 in print(_('Something to translate'))
)。
如文档所述:
_() 函数 [is] 安装在 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()
的模块。否则,结构可能会更简单,因为_()
从 main_script.py 调用足以触发 F821。
解决看起来很糟糕(或更糟)的情况的解决方案:
# noqa
使用在每行末尾添加注释_()
--ignore
F821(不想这样做,因为这在其他情况下很有用)