Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの「モジュール」と「パッケージ」の違いとは?初心者向けにわかりやすく解説

モジュールとパッケージの基本的な違い

Pythonでは、任意の .py ファイルはすべてモジュールとして扱われます。モジュール名は、拡張子 .py を除いたファイル名そのものであり、モジュール内部では __name__ 属性として参照できます。

一方、パッケージとは複数のPythonモジュールをまとめたものです。具体的には、モジュール群が格納されたディレクトリに __init__.py ファイルが配置されているものを指します。この __init__.py の存在こそが、単なる「Pythonスクリプトの入ったフォルダ」と「パッケージ」を区別する目印となります。

また、各階層のディレクトリにそれぞれ __init__.py が存在すれば、パッケージは何階層でも入れ子(ネスト)にすることが可能です。

importしたときの実際の挙動

モジュールをインポートしてもパッケージをインポートしても、Pythonが生成するオブジェクトの型は常に module 型です。つまり、「モジュール」と「パッケージ」の違いは、あくまでファイルシステム上の構造によるものであり、インポート後のオブジェクトの種類としては同一です。

ただし重要な注意点があります。パッケージを import しても、そのパッケージ直下にあるサブパッケージやサブモジュールは自動的には読み込まれません。直接参照できるのは、そのパッケージの __init__.py 内で定義された変数・関数・クラスのみです。

具体例:datetimeモジュールの場合

たとえば標準ライブラリの datetime には、date というサブモジュールが含まれています。しかし datetime を import しただけでは date は使えず、別途インポートする必要があります。

>>> import datetime
>>> date.today()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'date' is not defined
>>> from datetime import date
>>> date.today()
datetime.date(2017, 9, 1)

補足:名前空間パッケージについて

なお、Python 3.3以降ではPEP 420によって「名前空間パッケージ(namespace package)」が導入され、__init__.py を持たないディレクトリもパッケージとして扱える場合があります。ただし、従来型の通常パッケージを作成する場合は、依然として __init__.py を配置するのが標準的な作法です。

  1. 【Python】Tkinterのroot.destroy()とroot.quit()の違いを徹底解説

    PythonのGUIライブラリ「Tkinter」では、アプリケーションを終了する方法として destroy() と quit() の2つのメソッドがよく使われます。似たような役割に見えますが、実際には動作が異なります。この記事では、それぞれの違いをサンプルコード付きでわかりやすく解説します。 root.destroy()とは tkinterのウィンドウオブジェクトに対して destroy() メソッドを呼び出すと、mainloop の処理が終了し、ウィンドウ内のすべてのウィジェットが破棄されます。つまり、ウィンドウそのものが完全に閉じられ、バックグラウンドで動作しているインタプリタ(Tcl/T

  2. Pythonのtkinterとtkinter.ttkウィジェットの違いとは?スタイリング方法を解説

    tkinter.ttkは、tkinterウィジェットのスタイル(見た目)を設定するためのモジュールです。HTML要素にCSSでデザインを適用するように、tkinter.ttkを使うことでtkinterウィジェットの外観を自由にカスタマイズできます。 tkinterウィジェットとtkinter.ttkの主な違い tkinterウィジェットは、ボタン・ラベル・テキスト・スクロールバーなど、基本的なGUI部品を追加するために使用します。一方、tkinter.ttkは標準のtkinterよりも多くの種類のウィジェットをサポートしています。 tkinter.ttkではPlaceやPack()、Grid