当gettext安装_时,如何避免flake8的"F821未定义名称'_'"?

zez*_*llo 8 python gettext python-3.x pyflakes flake8

问题概述:

在我的项目的主脚本中,gettext安装_()在其他模块中用于翻译的函数(如in print(_('Something to translate'))).

正如文件所述:

_()函数[是]安装在Python的内置命名空间中,因此可以在应用程序的所有模块中轻松访问它.

所以,一切都运行良好.

唯一的问题:flake8显示错误(实际上由PyFlakes返回):

$ flake8 *.py
lib.py:2:12: F821 undefined name '_'
main_script.py:8:7: F821 undefined name '_'
Run Code Online (Sandbox Code Playgroud)

这是正常的,因为_在main_script.py和lib.py中确实没有定义.

简单的结构,重现问题:

.
??? lib.py
??? locale
?   ??? de
?       ??? LC_MESSAGES
?           ??? myapp.mo
?           ??? myapp.po
??? main_script.py
Run Code Online (Sandbox Code Playgroud)

lib.py包含这个:

def fct(sentence):
    return _(sentence)
Run Code Online (Sandbox Code Playgroud)

和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'))
Run Code Online (Sandbox Code Playgroud)

和myapp.po包含:

msgid ""
msgstr ""
"Project-Id-Version: myapp\n"

msgid "A sentence"
msgstr "Ein Satz"
Run Code Online (Sandbox Code Playgroud)

(由poedit编译以生成mo文件).

如上所述,主脚本确实有效:

$ ./main_script.py 
Ein Satz
Ein Satz
Run Code Online (Sandbox Code Playgroud)

重要提示:我正在寻找一个在脚本的工作既是一个解决方案gettext.install()被称为所有其他模块不需要调用 gettext.install().否则,结构可能更简单,因为_()从main_script.py 调用足以触发F821.

解决看起来不好(或更糟)的情况的解决方案:

  • 使用# noqa在每行末尾添加注释_()
  • --ignore F821(不想这样做,因为这在其他情况下很有用)

Ano*_*ous 23

您可以指定--builtins="_"哪个更具体--ignore F821.

如果您不喜欢命令行参数,您也应该能够在配置文件中指定它.