python - 如何避免 flake 8's "F821 undefined name '_' “when _ has been installed by gettext?

标签 python python-3.x gettext pyflakes flake8

问题概述:

在我的项目的主脚本中,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/

相关文章:

linux - 如何使用 grep(或其他 LSB 工具)计算 .po 中的空翻译?

python - 如何生成 gettext 复数形式表达式的示例?用Python?

python - 我应该使用 SQLObject、SQLAlchemy 还是 SQLAlchemy + Elixir?

python - random.choice 的加权版本

python - sympy 的问题用数学方程解决(python)

自定义类型的 python 列表构造函数-长度调用两次

python - 使用 str.rjust 和变量格式化

python - 将字符串转换为不带 strptime 的日期时间对象

python : No translation file found for domain using custom locale folder

python - MySQL - INSERT IGNORE 递增 auto_increment 主键