モジュール (旧版 ~2019/05/12)
何それ?:モジュールは Python の定義や文が入っており、接尾語に .py がついたもの
メリット:コードの再利用がしやすくなる。コードの見通しがよくなる。
関数の章で作成したsample.pyもモジュール!
まず sampleをモジュールとして使ってみる。
code: sample_module.py
import sample
sample.greeting()
標準モジュール
Pythonをインストールすると、sampleのように便利なモジュールが既に使える状態となっています。
試しに、日付を扱うdatetimeモジュールを呼び出してみましょう。
datetimeモジュールには、dateクラスがあり、その中にtodayメソッドがあります。
今回はそれを呼び出します。
code: sample_module.py
import datetime
date_class = datetime.date
now = date_class.today()
print(now)
モジュールの呼び出し方
上記の例も含めて主に三種類の方法があります。
code: sample_module.py
# モジュールだけを呼び出し
import datetime
date_class = datetime.date
now = date_class.today()
print(now)
# 一行でクラスまで呼び出し
from datetime import date
now1 = date.today()
print(now1)
# 別の名前として呼び出し
import datetime as dt
date_class2 = dt.date
now2 = date_class2.today()
print(now2)
モジュールの検索パス
今、fooというモジュールをインポートしたとき Python は次のルールで foo モジュールを探します。
入力されたスクリプトのあるディレクトリ (あるいはファイルが指定されなかったときはカレントディレクトリ)。
PYTHONPATH (ディレクトリ名のリスト。シェル変数の PATH と同じ構文)。
インストールごとのデフォルト。
実行している Python がどのようなモジュール検索パスで動作しているかは、
次のようにして知ることができます。
code: sample_module.py
import sys
print(sys.path)
良く出くわすエラー
ModuleNotFoundError: No module named 'XXXXX'
インポートで指定したモジュールが検索パスにないか、インストールされていない。
NameError: name 'XXX' is not defined
モジュールで定義している関数や変数の指定方法を間違えている(名前間違いのtypo)。
組み込み関数 dir() を使うと、指定したモジュールにどんな名前が定義されているかを知ることができます。
code: sample_module.py
import datetime
print(dir(datetime))
'MAXYEAR', 'MINYEAR', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'date', 'datetime', 'datetime_CAPI', 'sys', 'time', 'timedelta', 'timezone', 'tzinfo' ちょっと休憩
次のことは、いまは理解する必要がないレベルの余談です。
datetimeモジュールで現在時刻のtimestamp()を参照すると浮動小数点が印字されます。
code: python
>> now = datetime.datetime.now()
>> now
datetime.datetime(2018, 12, 4, 14, 58, 45, 626901)
>> now.timestamp()
1543903125.626901
これは、内部的にはエポックタイムと呼ばれる1970年1月1日 00:00:00 を起点とした秒数で管理されているからです。
以前に多く見られた32ビットアーキテクチャのCPUを持つコンピュータでは、2038年1月19日3時14分7秒以降うまく時刻を
処理できなくなり誤動作する可能性があることが知られています。2038年問題