誰しも避けては通れないimport文について徹底解説します。ぜひimportと仲良くなりましょう。
ここで学習すること
- モジュール?パッケージ?ライブラリ?
- importとは
- import文の基本的な使い方
モジュール?パッケージ?ライブラリ?
まずはモジュールからです。モジュールとはPythonにおいては関数やクラスなどをまとめて記述したファイルの事を言います。
はい、冷静に考えると、それは普通の.pyファイルと変わりありません。importの説明がまだですが、importをあえて意識して表現すると、importされるつもりの.pyファイルがモジュールというのも1つの表現の仕方かも知れません。
そしてそのモジュールが複数集まって、文字通りパッケージングした物をパッケージと呼んでいます。もう少し物理的な、そしてPythonの仕様上の話をすると、フォルダに__init__.pyがあれば、そのフォルダをパッケージとして扱えます。このとき、__init__.pyの中身は空でかまいません。(空で良いの!?)
さて、すでにpipコマンドで各種パッケージをインストールされたかと思いますが、そういったパッケージのインストールによってご自身の環境にはモジュールが増えているはずで、それらをご自身が開発中のソースコードの中でからインポートするという構図になります。
ここで、すでに置き去り感がかなりありますが、ライブラリという言葉は、Pythonの世界では固有名詞的な言葉では無く、一般名詞としてのライブラリという形になるので、モジュールの中にも複数の機能があり、もちろんパッケージの中にも複数の機能があるわけなので、どちらにもライブラリという言葉をあてることがあり得ます。
そして全く躊躇無くライブラリという言葉を使ってきます・・・
ライブラリという言葉は気にせず感覚で使って支障はなさそうです。
importとは
importとは、いまご自身が開発中、編集中のソースコードの外側で実装されている機能を使えるようにするための物です。自作か他作は問わず、別ファイルの中にあるものを使いますよということを知らせているのです。他の言語でも例えばJavaであればまさしくimportがありますし、C言語ではincludeといった風に、考え方自体は特別なものではないでしょう。
まぁimportについて知りたいと思っている方にとってみても、そんなことは十分承知かも知れません。では、importする対象は何でしょうか。
import sys
この例でいうところのsysって何でしょう?ということです。
モジュール? パッケージ? ライブラリ? 一体どれでしょう。
実は指定しているのはモジュールです。
と、ここまではメジャーなサイトでの解説とまるで変わりません。たまにこれで話が終わっている解説も見かけたりしますが、すこしだけ嘘というか誤解を生じる説明になっているのでここで補足です。
補足
たしかに例にあるsysはモジュールです。
そしてimportしようとして見つからなかった場合に発生するエラーはModuleNotFoundErrorというエラーで、Python自身がモジュールと言っています。
なんですが、後述の使い方で登場するfrom package import item
の形で使う場合には、itemはpackage内のサブパッケージ、関数、クラス、そして変数でも構いません。
そしてその場合のエラーは、ImportErrorでPython自身もモジュールとは言ってません。なんだかなぁとは思わないではないですが、importに指定するのはモジュールだけではないので、これまで違和感を持たなかった方はそれでも結構ですが、違和感を持った方はこの際はっきりと意識しておいた方が良いと思います。
import文の基本的な使い方
サンプルコード
common.py
#!/usr/bin/env python3.8 def plus(x, y): return x + y if __name__ == "__main__": plus(1, 1)
person.py
#!/usr/bin/env python3.8 class Person(): def __init__(self, name = "ken", age = 10): self.name = name self.age = age def __str__(self): return self.name + " " + str(self.age) def to_dict(self): return {"name": self.name, "age": self.age} class Staff(Person): is_staff = True def to_dict(self): return {"name": self.name, "age": self.age, "is_staff": self.is_staff} class Member(Person): is_staff = False def to_dict(self): return {"name": self.name, "age": self.age, "is_staff": self.is_staff}
sample.py
#!/usr/bin/env python3.8 import sys import common from person import Member if __name__ == "__main__": result = common.plus(1, 2) print(result) member = Member("john", 22) print(member.to_dict())
説明
最も単純な使い方は以下のような使い方です。
import sys
この一文を書くだけで、sysのもつ機能を使うことができます。
import sys, os
のように複数列挙することも出来ます。が、全然関連性の無いものは独立した行にする方が望ましいと思いますし、実際各種整形機能(linter)などでもそのように矯正されます。
もしあなたが共通的な機能をcommon.pyというファイルの中でプログラムしたならば、以下のように書けばその機能が使えるようになるわけです。
import common
もう一つは、以下のような書き方を見かけるかも知れません。
from person import Member
person.pyにてプログラムしたMemberクラスをimportしています。
さきほど、複数列挙してimportできるという説明をしましたが、fromを使ったケースでは、複数のアイテムを列挙した方がスマートだと思いますので、使い時はここかと思います。
なお、もしまだクラスについてまだ学習していない方は、クラスを参照してください。それからサンプルのクラス内でto_dict()が登場していますが、使用しているのは辞書です。こちらも必要に応じて型 辞書を参照してください。
実行結果
$ python sample.py 3 {'name': 'john', 'age': 22, 'is_staff': False} $
このように異なるファイルでプログラミングされた内容を活用するためにimport文は欠かせません。
さて最初のsysに話を戻しますと、common.pyは自分で書いて自分で名付けたから何が入っているかは誰よりも知っているわけですが、sysって何が出来るの?他に何があるの?って話になるかと思います。
そんな時は、公式ドキュメントを参照しましょう。より上位から辿っていくと、こんな感じです。
公式ドキュメントにはpythonで提供されているもの全て書かれています。読み方は少し慣れが必要かもしれませんが、とにかく情報源はここです。遠回りな気がするかもしれませんが、必ずここをスタート地点にすることをお勧めします。