PHPしか知らない僕がPythonを少し触ってみたよ 〜別ファイルを読み込む〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
なうろーでぃんぐ

この記事を三行にまとめると

requireやincludeに相当するような処理
どんどんピリオドでつないでいけばオーケー
importを使えば必要なものを読み込むことができる
以前「import」を使ってモジュールを読み込む方法について触れたことがありました。

アーマードじゃないモジュール

あの時はmathとかdatetimeとか最初から用意されてるようなモジュールを使用する際にimportを使うぞって話をしたんですが、このimportは自作したファイルを読み込む場合にも使うことができます。

単純にファイルを読み込むだけの場合もあればファイルの中の特定のクラスや関数だけを読み込んだりもできるので、いろいろパターンを見てみましょう。



ファイルを読み込む

まずは単純にファイルを読み込む場合。これはPHPで言うところのrequireやincludeに相当するような処理です。

ここでは適当なフォルダに「test.py」「hoge.py」という二つのファイルを用意して、test.pyの方でhoge.pyファイルを読み込んでみます。

#hoge.py
print('norm-nois.com')

#test.py
import hoge

これでtest.pyを実行すればhoge.pyが読み込まれて「norm-nois.com」の文字が出力されます。

同じディレクトリ内にあるファイルは「import ファイル名」でファイルを読み込むことができます。「.py」の拡張子は書かない。

もしも一つ下の階層にあるファイルを読み込みたい場合は少し書き方が変わります。

例えばこんな感じのファイル構成の場合。

/root
  ├ /sample
  │   ├ __init__.py
  │   └ hoge.py
  │
  └ test.py

「sample」というフォルダの中にあるhoge.pyを読み込みたい場合は、フォルダの中に「__init__.py」というファイルを作る必要があります。

test.pyの中身はこんな感じ(↓)

#test.py
import sample.hoge

importの書き方が「フォルダ名.ファイル名」に変わっていますね。階層が下がる場合はフォルダ名とファイル名をピリオドでつなげます。もっと深くなれば「sample.sample2.sample3.hoge」みたいにどんどんピリオドでつないでいけばオーケー。PHPのディレクトリセパレータに相当するものがピリオドみたいな感じですかね。

fromを使って読み込むこともできます。

#test.py
from sample import hoge

今回のようなケースの場合は__init__.pyには特に何も書く必要はありません。



変数を使う

hoge.pyを読み込んでその中にある変数を使う場合もピリオドが活躍します。

#hoge.py
text = 'norm-nois.com'

#test.py
import hoge
print(hoge.text)

hoge.pyの中で定義した「text」という変数を使っています。こういう場合も「ファイル名.変数」とピリオドでつなぎます。

fromを使ってファイルの中にある変数を直接importすることも可能です。

#test.py
from hoge import text
print(text)

この場合はファイル名をピリオドでつなぐ必要がなくなるので、同じ変数を繰り返し使うならこっちの方が良いかもしれませんね。

変数を複数使用する場合も同様のやり方でいけます。

#hoge.py
domain = 'norm-nois.com'
name = 'あかつきのお宿'

#fromを使わない場合
import hoge
print(hoge.domain)
print(hoge.name)

#fromを使う場合
from hoge import domain, name
print(domain)
print(name)

階層が下がる場合も考え方は一緒で「フォルダ名.ファイル名.変数」とするか、fromを使って読み込めます。

#fromを使わない
import sample.hoge
print(sample.hoge.domain)
print(sample.hoge.name)

#fromを使ってファイルを読み込む
from sample import hoge
print(hoge.domain)
print(hoge.name)

#fromを使って変数を読み込む
from sample.hoge import domain, name
print(domain)
print(name)



関数を使う

関数の使い方も基本的には変数と一緒です。ファイル名と関数名をピリオドでつなぐか、fromを使って関数名だけを書くようにするか。

#hoge.py
def output() :
  print('norm-nois.com')

#fromを使わない
import hoge
hoge.output()

#fromを使う
from hoge import output
output()

階層が下がる場合も同様です。



クラスを使う

クラスも一緒です。ファイルを読み込んだりクラスを読み込んだり、クラスの中の特定のメソッドだけを読み込んだりラジバンダリ。

#hoge.py
class SampleClass() :
  def output(self) :
    print('norm-nois.com')

#fromを使わない
import hoge
hoge.SampleClass().output()

#fromを使う
from hoge import SampleClass
SampleClass().output()






いくつかパターンを見てみましたが、一言でまとめるならimportを使えば必要なものを読み込むことができるってことですね。

fromは使うべきなのかなるべく使わない方が良いのかという点については正直よく分からないです。上記でも述べたように同じ関数や変数を何度も使うならfromを使った方が良いような気はするのですが、開発チームのコーディング規約とかによっても影響あったりするのかな……?

あるいはimportでファイルそのものを読み込むよりも、fromと合わせてファイルの中の特定のクラスや関数だけを読み込む方がパフォーマンスが良いとかあるんでしょうか。その辺も今度調べてみようかしら。



その他のPythonを少し触ってみたの記事はこちら
前書きと索引的な
 もしかしたら何か関連しているかも? 
 みんなからのコメント 
2018年11月21日 18:52:14
にしざわ
> fromは使うべきなのかなるべく使わない方が良いのか

・外部との依存度が下がる
・ファイルの冒頭を見れば外部ファイルのどの
 関数、クラスを使っているかが分かる
という理由でなるべく使うようにしております。
2018年11月22日 11:07:58
まっち~(管理人)
なるほど。「ファイルの冒頭を見れば外部ファイルのどの関数、クラスを使っているかが分かる」というのは確かに大きいですね。納得です。