2013-05-12 3 views
14

私は自分のプロジェクトで使用するいくつかのモジュールを1つのパッケージ(ツールキットの一種)に持っています。私はモジュールをインポートするときに外部モジュールを非表示にする(コード補完など)

from the_toolkit import matrix_kit 

でパッケージからモジュールをインポートした後VIMIPythonやコード補完を使用する場合

the_toolkit: 
    __init__.py 
    basic_io.py 
    simple_math.py 
    matrix_kit.py 
    ... 

は、今私はmatrix_kit.py輸入モジュール/機能の束を得る:構造は次のようになります(array,math,log,loggin,format_excなど)と、matrix_kitが定義する実際の機能とを比較する。 matrix_kitモジュールのコード補完でmathまたはarrayに興味がないので、他のすべてを除外するにはどうすればよいですか?

__init__.pyは、多くのpythonistasが示唆するように空ですか、それを行う方法ですか?あなたは__all__

+0

http://stackoverflow.com/a/19757025/1834164を参照してください。これは、ipythonでもモジュールを隠すために '__all__ 'をどのように使用できるかを説明しています。 – user1834164

答えて

15

のうちのいくつかの走行距離を得ることができます

+0

これは素晴らしい回避策のようですね、ありがとう! – tamasgal

0

私は同じ問題を抱えていたし、私のすべての輸入品にアンダースコアリーディングを追加することによって、それを解決しました。それは華麗に見えませんが、あなたが何をしているのかを実現します。

from __future__ import division as _division 
import numpy as _np 
import pandas as _pd 

from ... import *を使用してモジュールをインポートすると、アンダースコアなしで始まるものだけがインポートされます。またはIPythonまたはスパイダーでタブ補完を使用するとき。

+1

もっと具体的になりますか?パッケージ内のすべてのモジュールに '__all__'を追加して、重要な機能をリストアップする必要がありますか? (* import * ant、haha) – tamasgal

+0

@second:モジュールで '__all__'を定義してから、そのモジュールを(IPythonでスターインポートをしないで)インポートしようとしましたか? –

+0

私は '*'を使用せず、モジュールに '__all__'を追加しようとしましたが、問題は解決しません。 – tamasgal

3

私はこのアプローチを好んで利用しました。プロジェクトの構造から始めて、表示したくないコンテンツをすべて非表示にします(matrix_kit)。モジュールの名前の先頭で

the_toolkit: 
    __init__.py 
    basic_io.py 
    simple_math.py 
    matrix_kit.py 
    ... 

同じ名前のパッケージに移動matrix_kit.py、および配置1アンダースコア:

the_toolkit: 
    __init__.py 
    basic_io.py 
    simple_math.py 
    matrix_kit: 
     __init__.py 
     _matrix_kit.py 
    ... 

今_matrix_kit.pyでの名前をリストグローバル変数__all__ = [...]を追加します表示させたいすべての関数/クラス/変数そして、matrix_kitに/ のinitは、この行を追加するの.py:

from ._matrix_kit import * 

それが唯一のモジュールの__all__属性に列挙されたものをインポートします。その後、以前と同じようにmatrix_kitをインポートしている間に、__init__.pyとその内容を実際にインポートします。

関連する問題