当gettext安装了flake8的“F821未定义的名称”时,如何避免它?

2024-05-16 11:05:07 发布

您现在位置:Python中文网/ 问答频道 /正文

问题概述:

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

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注释
  • --ignoreF821(不想这样做,因为这在其他情况下很有用)

Tags: 模块installthepy脚本mainlibscript