7

する__init__.pyときは、チェックを実行していfrom myprojects.something import blablaました。

今日、私は使い始めてpyzmq、舞台裏で何が起こっているのかを見たいと思っていました. そこで、github でコードを閲覧したところ、(私にとっては)__init__.py自分では説明できない奇妙な使用法が見つかりました。

たとえばzmq/core/__init__.py。の値を追加するポイントは何zmq.core.__all__ですか?__all__zmq.core.constants, zmq.core.error, zmq.core.message, etc.

zmq/__init__.py最後に

__all__ = ['get_includes'] + core.__all__

whereget_includesは、基本的にモジュールのディレクトリと親ディレクトリ内の utils ディレクトリのリストを返す関数です。

そのポイントは何ですか?それによって何が__init.py__達成されましたか?

4

1 に答える 1

13

は、ここに記載されている__all__とおりに誰かが実行した場合に使用されますfrom module import *

唯一の解決策は、パッケージの作成者がパッケージの明示的なインデックスを提供することです。import ステートメントは次の規則を使用します: パッケージの__init__.pyコードが という名前のリストを定義している __all__場合、 from package import * が検出されたときにインポートする必要があるモジュール名のリストと見なされます。パッケージの新しいバージョンがリリースされたときに、このリストを最新の状態に保つのは、パッケージの作成者の責任です。パッケージの作成者は、パッケージから * をインポートする用途が見当たらない場合、サポートしないことを決定することもあります。たとえば、ファイルsounds/effects/__init__.pyには次のコードを含めることができます。

__all__ = ["echo", "surround", "reverse"]

これはfrom sound.effects import *、サウンド パッケージの 3 つの名前付きサブモジュールをインポートすることを意味します。

の用途の 1 つ__all__は、パッケージ ビルダーが、ユーザーにとって便利でありながら、パッケージを機能する方法でパッケージを構成できるようにするためのツールです。具体的には、pyzmq の場合、次のようなコードを記述できます。

import zmq
print zmq.zmq_version()

完全なドット付きモジュール名を使用するのではなく、次のようにします。

print zmq.core.version.zmq_version()

pyzmq のパッケージ デザイナーは__all__、ネストされたモジュールから名前空間の最上位レベルまで名前空間要素を昇格させるために使用しているため、ユーザーはパッケージの構造に悩まされません。

于 2012-09-20T22:39:12.517 に答える