Python 如何避免雪花8';s";F821未定义名称'_'&引用;gettext何时安装了u? 问题概述:
在我的项目的主脚本中,Python 如何避免雪花8';s";F821未定义名称'_'&引用;gettext何时安装了u? 问题概述:,python,python-3.x,gettext,pyflakes,flake8,Python,Python 3.x,Gettext,Pyflakes,Flake8,在我的项目的主脚本中,gettext安装函数。()用于其他模块中的翻译(如print(uquo to translate'))) 如所述: 函数()安装在Python的内置名称空间中,因此在应用程序的所有模块中都可以轻松访问 所以,一切都很顺利 唯一的问题:flake8显示错误(实际上由PyFlakes返回): 这是正常的,因为在main_script.py和lib.py中确实没有定义 重现问题的简单结构: 其中lib.py包含以下内容: def fct(sentence): retur
gettext
安装函数。(
)用于其他模块中的翻译(如print(uquo to translate'))
)
如所述:
函数()安装在Python的内置名称空间中,因此在应用程序的所有模块中都可以轻松访问
所以,一切都很顺利
唯一的问题:flake8
显示错误(实际上由PyFlakes返回):
这是正常的,因为在main_script.py和lib.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()
--忽略
F821(不要这样做,因为这在其他情况下很有用)
您可以指定--builtins=“\u”
,它比--ignore F821
更具体
如果您不喜欢命令行参数,您也应该能够在配置文件中指定它。如果您不介意参数,您可以指定--builtins=“\u”
,这比--忽略F821
更具体。是的,这有效地解决了问题。您可以将此作为答案发布。经典的研究性问题,得到了简洁有效的答案(这与我的需求直接相关)。@BobHy我必须指出,在其他地方(pytest和doctests)经历了奇怪的问题后,直接由于使用
作为翻译捷径,我最终决定放弃这个。我用tr
替换了\uu
,并在任何必要的时候导入它,就像导入任何其他模块一样。非常感谢配置文件的这种精确性!对于atom linter-flake8插件,目前还没有设置,但确实可以在用于项目的flake8配置文件中添加行builtins=.
(覆盖atom中定义的设置)。在其他地方(pytest和doctests)遇到奇怪的问题后,我必须明确这一点,直接由于使用\uu
作为翻译捷径,我最终决定放弃这种做法。我用tr
替换了\uu
,并在任何必要的时候导入它,就像导入任何其他模块一样。
msgid ""
msgstr ""
"Project-Id-Version: myapp\n"
msgid "A sentence"
msgstr "Ein Satz"
$ ./main_script.py
Ein Satz
Ein Satz