0

ファイルを含むいくつかのサブディレクトリを含むパッケージがあり__init__.pyます。これらのファイルは、チェックおよび初期化ジョブを実行します。

現在、これらのフォルダーのいくつかにはimport、それぞれの__init__.py. これらを「隠しモジュール」と呼びましょう。慣例として、アンダースコアを使用してそれらを明確にしています。

私の内部で次のことを行うのは悪い考えですか__init__.py_implementation.py同じフォルダーにある):

import os, sys
if sanity_check_successful:
    from ._implementation import *
    __all__ = sys.modules[__name__ + "._implementation"].__all__

サニティチェックが失敗するたびに、パッケージ内のそれぞれのモジュールレベルで意味のあるエラー情報を提供しようとしています。

__all__「隠しモジュール」から配列をコピーするなど、これは悪い考えですか? もしそうなら、なぜ、そしてより良い代替手段がありますか?

おまけ: この 2 行をもっと簡潔に書く方法はありますか?:

    from ._implementation import *
    __all__ = sys.modules[__name__ + "._implementation"].__all__

特に、ある場所では文字列を使用し"._implementation"、別の場所ではモジュール名として使用しなければならないことにうんざりしています。

4

2 に答える 2

3

サブモジュール__all__から設定する簡単な方法があります。._implementationそれ__all__以外の場合は問題ありません:

from ._implementation import *
from ._implementation import __all__

これは単に__all__ローカル モジュールの名前空間にインポートしてバインドするだけ__all__です。

于 2013-06-05T21:39:19.377 に答える
1

Martijn Pieters の答えよりもさらに簡単です。

'__all__'__all__リストに含めると、1行._implementationで自動的にインポートされます。from ._implementation import *


主な質問ですが、これは悪い考えですか?</p>

まあ、それはあなたが何をしているかに依存します。_implementationこれにより、基本的にパッケージはそのモジュールとまったく同じように見えます。それだけならいいのですが……それなら、そもそも引っ越し_implementationてみません__init__か?

複数のモジュールを 1 つにマージしようとしている場合は、おそらくそれらのすべてのリストを 1 つのリストに追加する__all__必要があります。stdlib には のような例がcollectionsあり、通常のパターンは次のとおりです。

from collections.abc import *
import collections.abc
__all__ += collections.abc.__all__

少し冗長に思えるかもしれませんが、確かに明確です。


あなたの編集された質問から、あなたがしていることはまったく同じように合理的であると思います.collections最も明確で最も慣用的な解決策は、同等のことを行う=こと+=ですが、複数のリストを一緒に追加します)。

しかし、これから:

import foo
bar = foo.bar

…は(ユースケースに十分近いように)以下とほぼ同等です。

from foo import bar

… Martijn Pieters の答えは明らかな単純化です。

from ._implementation import *
from ._implementation import __all__

だから、私はそうします。

于 2013-06-05T21:44:51.850 に答える