ここで、f.py内に書いた関数自体が色々な他のモジュールに依存している場合、そのモジュールの読み込みは、どこで行うのがいいのでしょうか。
1) f.pyのスクリプトの冒頭部分にモジュールのimportを書いておく。
2) 自分で定義する各関数内でimportを書く
3) f.pyではなくそれをインポートして実行する側のスクリプト(e.pyとします)にimportを書く
と3通りぐらいを考えました。
1)の場合、f.py内に定義した関数を呼び出して使う場合のみ(import済みとして)使用可能
2)の場合、その関数を呼び出す場合のみ使用可能
3)の場合、e.py内でf.pyに属する関数を呼び出した場合も使用可能
と理解しています。
関数定義を書く際に、依存するモジュールが外でインポートされてるか考えるのが面倒なので、関数定義内にimportを全部書いてしまいたいのですが、何か不都合が生じますでしょうか?
関数定義にimportを書くのは、モジュールが正常でない場合=importが失敗する場合に、そのエラーが発生するのが後になる、というデメリットがあるので、私はやらないし、基本的にするべきではないと思います。
import time def a(): import must_fail return def b(): # なんか時間がかかる処理のエミュレート time.sleep(30) return if __name__ == '__main__': b() a()
を実行するとImportErrorが発生するのは30秒後です。
そのぐらいならまぁいいのですが、1時間ぐらい処理したあとに該当の関数が初めて呼ばれてエラーになったら目も当てられません。
失敗するときは最初に失敗するように書くべきでしょう。
PEP8の推奨もファイル先頭のdocstringのあと、モジュールグローバルな宣言の前であるべき、となっています。
挙動の理解が正しいとすれば、その条件の下で書きたいように書けばいいだけかも知れませんが、ミスが少ないのはどういうやり方かとか、メリット・デメリットなどをアドバイスいただければと思います。