16

问题概述:

在我项目的主脚本中,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使用在每行末尾添加注释_()
  • --ignoreF821(不想这样做,因为这在其他情况下很有用)
4

1 回答 1

31

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

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

于 2016-06-15T16:19:35.860 回答