こんにちは!
皆さんはImportErrorやAttributeErrorを見たことがありますか?
ImportErrorはライブラリやモジュールが読み込めない時に出るエラーで、AttributeErrorはメソッドなどを呼び出すのに失敗した時に出るエラーです。
しかしきちんとimportもしていて、メソッド名なども間違っていないのにエラーが出ることがあります。
実はこれは初心者によくあるミスです
今回は、初心者が陥りがちなImportErrorやAttributeErrorになる原因を紹介します。
プログラムは間違っていないのになぜ
ImportError?AttributeError?
エラーが発生する場合を見てみましょう。
以下のプログラムは、現在時刻を表示するプログラムです。
from datetime import datetime
dt_now = datetime.now()
print(dt_now)
このプログラムを実行すると、以下のようなImportErrorが出てしまいます。
実行結果
ImportError: cannot import name 'datetime' from 'datetime'
以下のプログラムは上記のプログラムのimport方法を変えたプログラムですが、こちらではAttributeErrorが出てしまいます。
import datetime
dt_now = datetime.datetime.now()
print(dt_now)
実行結果
AttributeError: module 'datetime' has no attribute 'now'
皆さんはどこが間違っているかわかりますか?
上記のプログラムは、以下の記事で紹介している現在の時刻を取得するプログラムですが、どこも間違っていないように思います。
なぜエラーが出てしまうのでしょうか?
では、答え合わせにいきましょう。
実は間違っているのはプログラムの中身ではなく、プログラムのファイル名です。
プログラムをファイル名を「datetime.py」としていますが、datetimeという名前は、使用しているモジュール名と同じ名前です。
プログラムのファイル名を使用するモジュール名と同じ名前にしてしまっているんですね。
Importする際はカレントディレクトリから参照するため、カレントディレクトリに使用するモジュール、ライブラリと同じ名前のファイルが存在する場合はこの方なエラーが発生してしまいます。
プログラムのファイル名をつける際は、ファイル名を存在するライブラリやモジュール名などと同じ名前をつけないようにしましょう。
エラーが出ない場合がある
プログラムのファイル名を存在するライブラリ名などと同じ名前にしてしまっても、エラーが出ない場合があります。
それは、統合開発環境(IDE)を使用している場合です。
全ての統合開発環境でエラーが出ないのかは確認できていませんが、spyderを使用した場合にはエラーが出ないことを確認しました。
統合開発環境では、ファイルの参照方法などが違うんですかね。(詳しくはわかりません、ごめんなさい)
今回紹介したミスでエラーが出るのは、プロンプトやターミナルなどから、コマンドを入力してファイルを実行した場合です。
しかし、spyderのような統合開発環境を使用していても、きちんとファイル名は存在するライブラリ名などと同じにしないようにしておきましょう。
まとめ
いかがでしたか?
ImportError、AttributeErrorが出る初心者にありがちなミスを理解できましたか?
使用するモジュール、パッケージと同じ名前のファイルを作成してしまうとエラーが発生してしまう可能性があります。
ファイル名をつける際には、この点に気をつけて名前をつけるようにしましょう!