问题概述:
在我的项目的主脚本中,gettext
安装函数 _()
,该函数在其他模块中用于翻译(如 print(_('Something翻译'))
).
如 the doc 所述:
the _() function [is] installed in Python’s builtins namespace, so it is easily accessible in all modules of your application.
所以,一切正常。
唯一的问题: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(不想这样做,因为这在其他情况下很有用)
最佳答案
您可以指定比 --ignore F821
更具体的 --builtins="_"
。
如果您不喜欢命令行参数,您也应该能够在配置文件中指定它。
关于python - 如何避免 flake 8's "F821 undefined name '_' “when _ has been installed by gettext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37840142/