2013-03-06 12 views
5

階層の命名規則:pythonモジュールIは次のようにモジュール/パッケージ構造を持っているしたいと思います

/__init__.py 
/mymodule.py 
/mymodule/ 
/mymodule/__init__.py 
/mymodule/submodule.py 

そしてなどのモジュールを使用します。

import mymodule 
import mymodule.submodule 

をしかし、それはファイル "のmymoduleのように思えます。 py "は" mymodule "ディレクトリと競合します。

ここで正しい命名規則は何ですか?

ありがとうございました。

答えて

11

パッケージを作りたい場合は、Pythonが変換する方法を理解する必要がありますファイル名をモジュール名に変換します。

ファイルmymodule.pyは、mymoduleとして利用できます。インタプリタは、Python検索パスのディレクトリでそれを見つけると仮定します。大文字小文字を区別しないファイルシステムを使用している場合は、大文字と小文字を区別してインポートすることもできます(ただし、システムに依存する動作は避けてください)。

パッケージは、__init__.pyファイルのあるディレクトリです。最近、これらのファイルがないパッケージを許可する動きがありましたが、私はこの答えのあまり一般的でないケースを無視します。パッケージはPython内のモジュールになり、そのコードは__init__.pyファイルから来ます。したがって、ファイルmypackage/__init__.pymypackageとしてインポートできます。

__init__.pyファイルにはPythonの検索パスに直接意味はありません(おそらく、__init__モジュールをインポートできますが、これはおそらく悪い考えです)。

だから、あなたの状況に、ここで適切なファイルシステムのレイアウトです:

toplevel/ 
    mymodule/ 
     __init__.py  # put code here for mymodule 
     submodule.py # put code here for mymodule.submodule 

のみtoplevelフォルダは、Pythonの検索パスにする必要があります。

+0

私はPythonフォークが 'mymodule/__ init __。py'に重要なコードを入れないことを見てきました。 [アレックスMartelli](http://stackoverflow.com/a/2361278/188535)、これとは相反すると思われる。 (私は必ずしもそれに同意しない...) – detly

+2

それは本当です。より一般的なスタイルは、 'mymodule'の実際のコードを文書化されていないサブモジュールに入れ、それに対する公開APIを' __init __。py'にインポートすることです。有益な回答ありがとう。 – Blckknght

+0

Pythonが明らかなことを行うには、そのような汚いハックを必要とするのは残念です。 –

4

あなたはpackageを扱っています。あなたが持つべきパッケージ構造は次のとおりです。

/some-parent-directory # This needs to be on sys.path 
    /mymodule # This is not really a module - it's a package 
     __init__.py # import mymodule 
     # init is loaded when you `import mymodule` or anything below it 
     some.py # import mymodule.some 
     implementation.py # import mymodule.implementation 
     files.py # import mymodule.files 
     /submodule 
      __init__.py # import mymodule.submodule 
      # init is loaded when you `import mymodule.submodule` or anything below it 
      submodule_impl.py # import mymodule.submodule.submodule_impl 
      goes.py # import mymodule.submodule.goes 
      here.py # import mymodule.submodule.here 

限りディレクトリがsys.pathであるとして、あなたが問題なくimport mymoduleまたはfrom mymodule.submodule import somethingを呼び出すことができるようになります。

あなたは(私は。すなわちfrom mymodule import SomeItemまたはサブパッケージfrom mymodule.submodule import AnotherItemから)パッケージのルートレベルから利用できるようにするために何かをしたいなら、あなたは適切な__init__.pyファイルにインポートすることができます。

たとえば、submodule_impl.pyモジュールで定義されているクラスCustomClasssubmoduleから直接インポートしたいとします。あなたのsubmodule/__init__.pyは、次の含まれていなければならないでしょう。そして、

from .submodule_impl import CustomClass 

あなたはsubmoduleから直接CustomClassをインポートすることができるだろう(すなわちfrom mymodule.submodule import CustomClass

関連する問題