0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】Python モジュールとパッケージ

Posted at

はじめに

Python を使って開発していると、必ず登場するのが モジュール(module)パッケージ(package) です。
「import ってどう動くの?」「自作モジュールってどう作るの?」という疑問に、この記事でまとめて答えます。

Python のコードが“整然とした街”のように構造化される仕組みを、実例ベースで解説します。


1. モジュール(module)とは?

結論から言うと:

1つの .py ファイルが 1つのモジュール

たとえば:

greet.py
math_tools.py
poyo.py

これら全部モジュールです。

◎ モジュールを import する方法

import greet
greet.hello("Anna")

「名前を呼べば出てくる」それが import。


2. パッケージ(package)とは?

パッケージ = モジュールが集まったフォルダ
そのフォルダに __init__.py が入っていることが必須。

例:

mypackage/
    __init__.py
    utils.py
    chess/
        __init__.py
        board.py

__init__.py は「ここはパッケージですよ」という“表札”です。


3. import の基本とバリエーション

Python の import は柔軟で、主に次の4パターン。


3.1 モジュールそのものを import

import utils
utils.do_something()

最も基本的で安全。


3.2 モジュールから特定の関数・クラスを import

from utils import do_something
do_something()

よく使われるが、名前衝突には注意。


3.3 as で別名をつける

import numpy as np

実務で非常に多いスタイル。


3.4 パッケージ内のモジュールを import

from mypackage.chess import board

さらに深く:

from mypackage.chess.board import print_board

4. 自作モジュールを作る

  1. greet.py を作成
  2. 中身を書く
def hello(name):
    print(f"こんにちは、{name}さん!")

別ファイルで呼ぶ

import greet
greet.hello("Anna")

完成。簡単すぎてびっくりするレベル。


5. 自作パッケージを作る

例として chessutils というパッケージを作ります。

chessutils/
    __init__.py
    move.py
    board.py

move.py

def legal_moves(piece):
    return ["a3", "a4"]

board.py

def print_board():
    print("8 × 8 Chess Board")

使用側

from chessutils.board import print_board
from chessutils.move import legal_moves

print_board()
print(legal_moves("pawn"))

6. モジュール検索パス(import の裏側)

Python は import するとき、この順序で探します:

  1. カレントディレクトリ
  2. PYTHONPATH
  3. site-packages(ライブラリ)

確認するには:

import sys
print(sys.path)

もし「import できない」場合は、ほぼこれが原因。


7. 相対 import(パッケージ内部での呼び出し)

同じパッケージ内で他モジュールを呼ぶ方法。

mypkg/
    a.py
    b.py

b.py から a.py を呼びたい:

from .a import func_a

. → カレントパッケージ
.. → 1階層上のパッケージ


8. よくある import の落とし穴

落とし穴 内容
モジュール名を標準ライブラリと同名にする random.py を作る→標準 random が壊れる
パッケージ内に __init__.py がない Python がパッケージと認識しない
sys.path をむやみに書き換える 一時的には便利だがプロジェクトが壊れやすい
相対 import の混乱 単体実行できず、必ず “パッケージとして実行” が必要

9. おすすめのプロジェクト構成(実務向け)

project/
    app/
        __init__.py
        router.py
        service.py
    core/
        __init__.py
        config.py
        util.py
    tests/
        test_service.py
    main.py

見通しが良く、保守もしやすい。


まとめ

  • モジュール = .py ファイル
  • パッケージ = __init__.py を含むディレクトリ
  • import には複数の書き方がある
  • 自作モジュール・パッケージは驚くほど簡単
  • 大規模開発にはパッケージ構造が必須

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?