Python ImportErrorの処理方法

Python学習【365日チャレンジ!】69日目のマスターU(@Udemy11)です。

突然ですが、田舎あるある常識をば。

  • 大きなカメが道路で轢かれてぺちゃんこになっている
  • 夜に歩いていると突然めっちゃでかい鳥が飛び去っていく
  • 星空がめっちゃ綺麗

このうちどれかに心当たりがある人は、間違いなく田舎に住んでいるもしくは住んでいた人に間違いはありませんので、安心してください。

って何を安心するの?

と思われちゃいますが、安心して田舎人であることに自信をもってください。

だって、東京なんて基本田舎の人の集まりで、生粋の江戸っ子なんてほんの一握りで、世の中のほとんどの人は田舎人なんですから。

ただ、田舎とはいえ、星空がめっちゃきれいに見える場所はなかなかないので、そんな星空をみられる場所はそうそういるわけではありません。

なので、ぜひ毎日Instagramにでも投稿してみてください。

もしかしたら、フォロワーをたくさん抱えるインフルエンサーになれるかもしれませんよ。

それでは、今日もPython学習をはじめていきましょう!

昨日の復習

昨日は、*(アスタリスク)を使ったimport__init__.pyについて学習しました。

フォルダ構造

session3 ┳ lesson.py
         ┗ package ┳ __int__.py
                    ┣ human.py
                    ┗ animal.py

package > human.py

def sing():
    return 'singing'

package > animal.py

def sing():
    return 'Kojoifdmoamdfoaid!!!!!'

package > __init__.py

__all__ = ['animal', 'human']

lesson.py

from package import *

print(human.sing())
print(animal.sing())

lesson.py実行結果

singing
Kojoifdmoamdfoaid!!!!!

*を使って、__init__.pyにリストを書き込めば、フォルダ内のモジュールを複数読み込むことができました。

ただ、この使い方は、コードを読む側からすると参照しているモジュールがわかりづらいので、推奨されていない使い方でした。

詳しくはこちらのエントリーを参考にしてください。

ImportErrorの処理

今日は、モジュールをインポートする際に生じるImportErrorの回避方法について学びます。

例えば、最初に作成したモジュールの階層を変更すると、そのモジュールをImportしているファイルにImportErrorが生じます。

フォルダ階層

session4 ┳ lesson.py
         ┗ package ┳ __int__.py
                    ┗ animal.py

#上記階層からdeep_packageフォルダを作成し、下記階層へanimal.pyを移動する

session4 ┳ lesson.py
         ┗ package ┳ __int__.py
                    ┗ deep_package┳ __int__.py
                                   ┗ animal.py

animal.py

def cry():
    return 'Waoooon!'

lesson.py

from package import animal

print(animal.cry())

このlesson.py場合、参照しているanimal.pyの階層を変更することによって、ImportErrorが生じます。

animal.pyの階層を変える必要が出てきたときに、try文を活用して、エラーを回避することができます。

try文を使ったエラー回避方法

try-except文は、エラーを回避するときに使いました。

ImportErrorでも同じように回避することが可能です。

lesson.py

try:
    from package import animal
except ImportError:
    from package.deep_package import animal

print(animal.cry())

出力結果

Waoooon!

モジュールのanimalpackageの中にあればインポートされて、もしなければ、下位層のdeep_packageanimalを読み込む設定になっています。

つまり、プログラム作成途中でモジュールの階層を変えた場合でも読み込み方で、正しいディレクトリにあるファイルを読み込むことができます。

使い方としては、作ったパッケージを配布するときに、最初にリリースしたパッケージはpackageにモジュールanimal入れて配布していたけれど、次のバージョンで、ファイルの階層を変更した場合に古いパッケージと新しいパッケージの両方を読み込めるようにtry-except文を使って、どちらでも読み込めるようにしておきましょう。

復習は大切

常々復習が大切と言っているわたしですが、復習を忘れてしまうと、過去に出てきたモジュールや関数の使い方がどんどん薄れていきます。

そうならないためにも、復習はとても大切でなにげに頭に浮かんだときや、別のチャプターでわからない関数などが出てきたときに、過去に書いた記事を読み返して、復習する必要があります。

こんなのあったな〜。

と思ったときには、必ず過去に学習した内容を復習する癖をつけましょう!

それでは明日もGood Python!