3

モジュールがあります:

test
   __init__.py

私は__init__.py一行を持っています:

import numpy as np

作成したいパッケージ (モジュールとサブモジュール) 全体で numpy を使用したい。

問題は、どういうわけか numpy が公開されていることです。IPythonを実行して実行すると

import test

test.np にアクセスできるようになります。

私は github で多くのパッケージを調べましたが、それらはしばしばメイン (sys、部門など) に多くインポートされ__init__.pyますが、それらのパッケージを IPython にインポートすると、外部モジュールは公開されません。

彼らは何をしているのですか?

4

2 に答える 2

3

__all__名前のリストまたはタプルに設定されたグローバル name を定義して、インポートされるものと、一般的にリストされるドキュメンテーション ツールを制限できます。

__all__ = ['function1', 'ClassName2']

名前はインポート__all__するものfrom test import *を制限し、特定のモジュールのパブリック API としてリストされているものを制限するためにドキュメント ツールによっても使用されます。

importステートメントのドキュメントを参照してください。

モジュールによって定義されたパブリック名は、モジュールの名前空間で という名前の変数をチェックすることによって決定されます__all__。定義されている場合、そのモジュールによって定義またはインポートされた名前である一連の文字列でなければなりません。で指定された名前__all__はすべてパブリックと見なされ、存在する必要があります。が定義されていない場合__all__、パブリック名のセットには、アンダースコア文字 ( ) で始まらないモジュールの名前空間にあるすべての名前が含まれます'_'__all__パブリック API 全体を含める必要があります。API の一部ではないアイテム (モジュール内でインポートおよび使用されたライブラリ モジュールなど) を誤ってエクスポートしないようにすることを目的としています。

__init__検査したモジュールは、ほぼ確実に__all__シーケンスを定義します。

関数が後でグローバル名にアクセスする必要がない場合は、モジュールから名前を再度削除することもできます。

del sys

それ以外の場合、IPython オートコンプリートはアンダースコアで始まらないすべての名前を使用します。オートコンプリートは__all__リストを無視しますが、 のような名前は無視します_sys

numpy.__init__モジュール(バージョン 1.8.0 より前) 自体が、再びグローバル名前空間から名前を削除します。

if __NUMPY_SETUP__:
    import sys as _sys
    _sys.stderr.write('Running from numpy source directory.\n')
    del _sys

しかし、ここでsysはバインドされて_sysおり、削除されていなくても IPython はその名前を無視します。numpyまた__all__、そのモジュールでリストを作成します。

numpyバージョン 1.8.0 以降では、ステートメントimport sysがそのファイルに追加され、IPython はそれをオートコンプリート用に提供します。これは、まだグローバル名前空間の一部であるためです。

于 2013-11-14T21:57:45.657 に答える
-1

何らかの形でローカル名前空間にのみインポートしていることを確認する必要があります。

于 2013-11-14T21:57:38.280 に答える