2017-10-20 10 views
0

numpy \ __ init__.pyライブラリのコードを見て、自分自身で__init__.pyを書こうとしたときに混乱します。 test.py__init__.pyで変数__all__を正しく拡張するには?

......

アプリ/

:ここ

はnumpyの\ __ init__.pyコードスニペット

__all__.extend(['__version__', 'pkgload', 'PackageLoader', 
      'show_config']) 
__all__.extend(core.__all__) 
__all__.extend(_mat.__all__) 
__all__.extend(lib.__all__) 
__all__.extend(['linalg', 'fft', 'random', 'ctypeslib', 'ma']) 

で、私のディレクトリ構造があります。 ..... lib1 \

............ __init__.py

............ Lib1File.py

............

\ sublib1 .......... ................... __init__.py

............ .......... ... SubLib1File.py

test.pyのコードが

from lib1 import * 

if __name__ == "__main__": 
    result1 = Lib1File.add(10, 15) # a simple function in Lib1File.py 
    print(result1) 
    result2 = Sublib1File.mul(10,15) # a simple function in Sublib1File.py 
    print(result2) 

LIB1内のコードです\ __ init__.pyは

です
from . import sublib1 
__all__ = ["Lib1File"] 
__all__.extend(sublib1.__all__) 
print(__all__)     # it can print ['Lib1File', 'Sublib1File'] on console 

LIB1内のコード\ sublib1 \ __ init__.pyは

__all__ = ["Sublib1File"] 

あるしかし、私はtest.pyを実行したとき、私はエラーに

*ファイル "test.py"、行を得ました1、モジュールlib1からインポート。 AttributeError:私もLIB1で__all__ = ['Lib1File', 'Sublib1File'] \ __ init__.py場合に、このエラーが出るのはなぜモジュールのLIB1は、 ' 'Sublib1File'

私の質問は

  1. 何の属性をされていませんか?

  2. 1つのインポートをまだ使用している場合、どうすればよいですか?from lib1 import *

  3. 質問2を解決できない場合は、__all__.extend(...)の目的はnumpy \ __ init__にありますか?

答えて

1

あなたがnumpyののトップレベル__init__モジュールで別の見てみる場合は、各from . import xyzため__all__対応from .xyz import *がありますを拡張するために使われていることがわかります。

対応するオブジェクトがモジュール自体で定義されていないか、他の場所からインポートされていない場合、モジュールの__all__に名前を追加することはできません。

を以下に追加します。from . import sublib1lib1/__init__.pyにします。

from .sublib1 import * 

は、例を動作させるには:

+0

ええ、私は気づいた。しかし、私はまだ問題を解決する方法を知らない。より具体的な変更をお願いしますか?ありがとう –

1

拡張@wyattsはlib1/__init__.pyに次の行を追加し、答えます。

0

あなたは@Wyatt、@MegaIngです。

私は3つの質問のためにここに答えを掲示します。

Q1。なぜlib1__init__.pyに__all__ = ['Lib1File', 'Sublib1File']が入っていてもこのエラーが出るのですか?

A1。モジュール名を__all__に追加するだけです。しかし実際にはディレクトリにSublibFileモジュールがありません。だから、Pythonはモジュール名だけでSublibFileモジュールの定義を見つけることができません。

Q2。まだ1つしか使用していない場合はどうすれば解決できますかimport from lib1 import *

A2。 1行追加from .sublib1 import *lib1/__init__.pyに追加します。これにより、__all__に定義されたモジュールがlib1\sublib1\__init__.pyからlib\パッケージになります。これにより、pythonがモジュール名で対応モジュール定義を見つけることができます。

Q3。 の__all__.extend(...)の目的は何ですか?

A3。拡張するために__all__の柔軟性。

関連する問題