ライブラリ
前回、geopandasで世界地図(+特定の地域の地図)を表示する方法を紹介しました。
今回はPythonプログラムのファイル名をライブラリ名にしてしまったことで起こったエラーに関してお話しします。
それでは始めていきましょう。
起こったこと
まずは何をどのようにしたらどんなエラーが出たのかからお話しします。
まずフォルダ・ファイル構成をこのようにしました。
test1
└── numpy.py
そして「numpy.py」の中身をこのようにしました。
import numpy as np
print(np.nan)
これを実行すると「nan」が表示されると思っていたのですが、このようなエラーが表示されてしまいました。
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[1], line 3
1 import numpy as np
----> 3 print(np.nan)
AttributeError: module 'numpy' has no attribute 'nan'
つまり「numpyというモジュールにはnanという機能はないよ」というわけです。
もちろん通常numpyには「nan」という機能はあります。
何がいけなかったのでしょうか?
問題はこのプログラムのファイル名にあります。
ファイル名を「numpy.py」としたがために「import numpy as np」でインポートされるのは通常のライブラリのnumpyではなく、このファイル自身になってしまったわけです。
何回か試しているうちにこんなエラーがでることもありました。
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[1], line 1
----> 1 import numpy as np
3 print(np.nan)
File ~/Desktop/ProgramingTestBox/Python/test/numpy_test/test1/numpy.py:18
1 # ---
2 # jupyter:
3 # jupytext:
(...)
14
15 # +
16 import numpy as np
---> 18 print(np.nan)
19 # -
AttributeError: partially initialized module 'numpy' has no attribute 'nan'
(most likely due to a circular import)
こちらの場合はプログラムの中で自分自身を呼び出し、その呼び出したプログラムの中でまた自分を呼び出すという循環的になってしまっているというエラーのようです。
どちらにせよファイル名をライブラリ名にしてしまったことで発生するエラーです。
対策:ライブラリ名をファイル名に使用しない
対策は簡単で、ライブラリ名をファイル名に使用しないようにするのが大事です。
つまりこんな感じ。
test2
└── numpy_test.py
import numpy as np
print(np.nan)
これを実行すると「nan」が表示されます。
ちなみにフォルダ名にライブラリ名を使用するのは大丈夫なようで、こんな構成であれば正しく「nan」が出力されます。
numpy
└── numpy_test.py
import numpy as np
print(np.nan)
実はこのミスは過去に何度かやって、その都度頭を悩ませていたのでまとめてみました。
次回は計算用モジュールmathモジュールを紹介していきます。
ではでは今回はこんな感じで。
コメント