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