web-dev-qa-db-ja.com

_がgettextによってインストールされたときに、flake8の「F821未定義の名前 '_'」を回避するにはどうすればよいですか?

問題の概要:

私のプロジェクトのメインスクリプトでは、gettextは他のモジュールで翻訳用に使用される関数_()をインストールします(print(_('Something to translate'))など)。

ドキュメント で述べられているように:

_()関数は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.pythis:

_#!/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"
_

(moファイルを生成するためにpoeditによってコンパイルされました)。

上記のように、メインスクリプトは機能します。

_$ ./main_script.py 
Ein Satz
Ein Satz
_

重要な注意:gettext.install()が呼び出されるスクリプト他のすべてのモジュールの両方で機能するソリューションを探していますthatを呼び出す必要はありませんgettext.install()そうでなければ、_() from main_script.pyは、F821をトリガーするのに十分です。

見栄えが悪い(または悪化している)状況を解決するための解決策:

  • _()を使用して、各行の最後に_# noqa_コメントを追加します
  • _--ignore_ F821(これは他の状況で役立つのでそれをしたくない)
10
zezollo

--builtins="_"よりも具体的な--ignore F821を指定できます。

コマンドライン引数が気に入らない場合は、構成ファイルでもこれを指定できるはずです。

22
Anonymous