一部の機能に必要なライブラリの一部が欠落している場合でも、実行できる必要がある Python プログラムに取り組んでいます。(編集:提案された最良の解決策を実装するための小さなコードを書きました。それはhereであり、doctest hereがあります。)
このようなライブラリの import ステートメントを、Python ファイルの先頭ではなく、それらを使用する関数にインラインで配置することで、これを解決しました。これは、ライブラリがなくてもファイルを完全にロードできることを意味しますが、関数の 1 つを呼び出そうとすると、もちろん ImportError がスローされます。
これは非常にうまく機能しているので、標準ライブラリ モジュールに対してもこれを行うことがあります。
ベースライン コード:
import numpy
def foo():
return numpy.array([])
def bar():
return numpy.array([1, 2, 3])
インライン インポートを含むコード:
def foo():
import numpy
return numpy.array([])
def bar():
import numpy
return numpy.array([1, 2, 3])
編集:
標準ライブラリコードをインライン化しないことに完全に同意します-明らかに悪いです。
保護されたインポートが正しい解決策だと思います。
特に、私は呼び出しに対していくつかのタイミング テストを行いました。時間差は、おそらくほとんどのアプリケーションにとって重要ではありませんが、かなりの差があります (細かい線、私は知っています!)。
些細なケースでは
import numpy
def f():
return numpy
私のマシンでは、100,000回の繰り返しで約180ミリ秒かかりますが、
def f():
import numpy
return numpy
約870msかかります。
非常に大雑把に言えば、これには 4 つの些細な関数呼び出しに相当するコストがかかるということです。それでも、費用がかからない場合は避けるのが最善です。
試してみると、インライン インポートのもう 1 つの欠点にも気付きました。関数が呼び出されたときに、これらのインポートが予期しないタイミングでオフになることです。リアルタイム要素を持つ私のアプリケーションでは、これは受け入れられません。