2017-02-04 5 views
0

私は現在、Pythonのインポートに少し不満を抱いています。私は正直なところ、何か間違ったことを覚えていて、間違ってインポートを実行していると思います。 Python Import Submodule Prefix

私は自分のアプリケーションのための次のようなディレクトリ構造をしている:私は、次のいるopen_app.pyで

import open_app.Open_App as Open_App 
if __name__ == "__main__": 
    main = Open_App() 
    input("Press a key to continue") 

:私は、次の

open_app 
|- __init__.py 
|- open_app.py 
|- core/ 
| |- __init__.py 
| |- data/ 
| | |- __init__.py 
| | |- data.py 
| |- settings/ 
| |- interface/ 
|- extensions/ 

のinitInを持っているの.py

from core import data as Data 
class Open_App(): 
    pass 

コア/ init .py、私は何も持っていません。コア/データ/ data.pyで

from data import Data as Data 

Iは、以下た:

class Data(): 
    pass 

問題は、私は、次の.py有するコア/データにおける

/INIT IDLEを使用してモジュールを実行すると、次のエラーメッセージが表示されます。

Traceback (most recent call last): 
    File "F:\Personal\Code\Python\open_app\__init__.py", line 1, in <module> 
    import open_app.Open_App as Open_App 
    File "F:\Personal\Code\Python\open_app\open_app.py", line 1, in <module> 
    from core import data as Data 
    File "F:\Personal\Code\Python\open_app\core\data\__init__.py", line 1, in <module> 
    from data import Data as Data 
ImportError: No module named 'data' 

私はちょうどインポートを動作させようとしています。作品

from core.data.data import Data as Data 

:だから私はに

コア/データ/ のinitの.pyファイルを変更することを決めました。しかし、私にとってこれは非常に良い解決策のようには見えません。すべてのサブモジュールにその上にあるすべてのモジュールディレクトリを接頭辞として付ける必要はありません。プロジェクトが単体テストを行うために大きくなるにつれて、それは非常に困難になります。

なぜ私はそのような名前に接頭語を付ける必要がありますか? のinitの.pyが

コア/データ

ディレクトリに存在するので、私がいることを考える必要があります。

コア/データ/ data.py

は、可視およびインポート可能だろう。実際にはそうではありません。

私は間違っていますか?私は非常に謙虚に尋ねなければならないと感じており、これは基本的なことを申し訳なく思っていますが、事前に助けていただければ幸いです。私は、PEPのドキュメントを読み込んでいて、何かをクリックしていないだけです。

ありがとうございます!

答えて

0

あなたは完全なパスを指定せずに__init__.pydataをインポートしようとしている場合は、相対インポートが何をしたい、おそらくです:

from .data import Data 

注使用しているData別名があるため、非常に不必要であることインポートされたオブジェクトは同じ名前を持ちます。

+0

これは不要かもしれませんが、おそらくコードのスタイルが一貫しているか、またはインポートされたクラスの将来の変更がそれを使用しているコードを壊さないようにしていますか? – will

+0

これは主に明示的なものです。相対輸入に関して、私はそれらに対する議論を聞いた。これを避けるためにコードを構造化する別の方法がありますか? –