9

モジュールがコードのどこにロードされるかは重要ですか? それとも、コード内のどこで宣言されているかに関係なく、ロード時に外部モジュールをロードする必要があるため、それらはすべて先頭で宣言する必要があります...?

例:

from os import popen

try:
    popen('echo hi')
    doSomethingIllegal;
except:
    import logging                   #Module called only when needed?
    logging.exception("Record to logger)

または、これはコンパイラによって次のように最適化されます。

from os import popen
import logging                      #Module will always loaded regardless

try:
    popen('echo hi')
    doSomethingIllegal;
except:
    logging.exception("Record to logger)
4

2 に答える 2

11

これは、違いが生じる可能性があることを示しています。

「インポートステートメントはほぼどこでも実行できます。関数内に配置して、可視性を制限したり、初期起動時間を短縮したりすると便利なことがよくあります。Pythonのインタープリターは、同じモジュールを複数回インポートしないように最適化されていますが、インポートステートメントを繰り返し実行すると、状況によっては、パフォーマンスに深刻な影響を与えます。」

これらの 2 つの OS の質問、ローカル インポート ステートメントは? 常にモジュールの先頭にインポートしますか? これについて詳しく議論します。

最後に、特定のケースに興味がある場合は、環境内の 2 つの選択肢をプロファイリング/ベンチマークできます。

私はスタイル上の慣例に従い、一貫性を保つために、すべてのインポート ステートメントをソース ファイルの先頭に配置することを好みます (また、ソース ファイル全体に散らばっているインポート ステートメントを探す必要がなく、後で変更を簡単に行うことができます)。

于 2012-05-20T10:42:35.480 に答える
2

一般的な経験則では、インポートはファイルの先頭に置く必要があります。これにより、コードを追跡しやすくなり、すべてのコードを調べなくてもモジュールに必要なものを簡単に把握できるようになります。

Python スタイル ガイドでは、インポートの外観に関するいくつかの基本的なガイドラインについて説明しています: http://www.python.org/dev/peps/pep-0008/#imports

ただし、実際には、特定の関数内からインポートすることが理にかなっている場合があります。これにより、循環するインポートが作成されます。

# Module 1
from module2 import B

class A(object):
    def do_something(self):
        my_b = B()
        ...

# Module 2
from module1 import A

class B(object):
    def do_something(self):
        my_a = A()
        ...

そのままでは機能しませんが、インポートを移動することで循環を回避できます。

# Module 1
from module2 import B

class A(object):
    def do_something(self):
        my_b = B()
        ...

# Module 2
class B(object):
    def do_something(self):
        from module1 import A
        my_a = A()
        ...

理想的には、これが発生しないようにクラスを設計し、場合によってはそれらを同じモジュールに含めることもできます。そのおもちゃの例では、それぞれのインポートをもう一方にすることは本当に意味がありません。ただし、実際には、すべてを同じモジュールにスローしたり、問題のメソッドを他のオブジェクトに抽出したりするよりも、メソッド自体に 1 つのメソッドのインポートを含める方が理にかなっている場合があります。

しかし、逸脱する正当な理由がない限り、私はモジュールの最上位の規則に従うと言いたい.

于 2012-05-20T18:26:55.620 に答える