どちらのスタイルが好きですか?モジュールレベルまたは機能レベルでインポートしますか?
スタイルA:
def foo():
import some_module
some_module.something
スタイルB:
import some_module
def foo():
some_module.something
はsome_module
のみ、この関数内、コードの他の場所で使用されていないと仮定する。
どちらのスタイルが好きですか?モジュールレベルまたは機能レベルでインポートしますか?
スタイルA:
def foo():
import some_module
some_module.something
スタイルB:
import some_module
def foo():
some_module.something
はsome_module
のみ、この関数内、コードの他の場所で使用されていないと仮定する。
実際、すでに述べたように、通常はPEP 8の推奨事項に従い、上部でインポートを実行することをお勧めします。しかし、いくつかの例外があります。それらを理解するための鍵は、第2段落の埋め込み質問にあります。「どの段階で輸入が行われますか?」
インポートは実際には実行可能なステートメントです。モジュールをインポートすると、モジュール内のすべての実行可能文が実行されます。 "def"も実行可能なステートメントです。その実行により、定義済みの名前が(すでにコンパイルされた)コードに関連付けられます。あなたが持っているのであれば:インポートモジュールで
def f():
import something
return None
、(コンパイル)のインポートとreturn文は、その時点で名前を「F」に関連付けられます。 f()を実行すると、そこにインポートステートメントが実行されます。
"非常に大きい"または "重い"ものをインポートするのを延期してから、関数を実行しないと(この場合はf)、インポートは行われません。これにより、時間を節約できます(スペースもあります)。もちろん、実際にf()を呼び出すと、インポートが実行されます(Pythonがキャッシュされた結果を使用してもまだそれが起こっていればチェックしなければなりません)。
多くのプロファイリングを行ってから、 "hugething"をインポートすると実行の90%で多くの時間を無駄にしていることがわかり、それらの10%で少し時間。
PEP 8は、すべてのインポートがモジュールの上部で行われることを推奨しています。モジュールにバインドされた名前を含むすべての名前は、ローカル、非ローカル、グローバル、組み込みのスコープで順に検索されます。
+1 PEP8。 [pep8 module](http://pypi.python.org/pypi/pep8)はコードをPEP8のガイドラインと照らし合わせてチェックします。 –