3

したがって、2つのモジュールAとB、および別のインストール済みモジュールCがあります。AとBでCのいくつかのメソッドを使用するとします。また、BでモジュールAが必要です。したがって、論理的には次のようになります。

A:

import C

B:

import A

ロジックは、BにAとCの関数が含まれることを教えてくれます。ただし、これはデフォルトではこのようには機能しません。モジュールAのCの関数を参照するには、追加のレベルの名前空間参照が必要です。

A.C.some_c_module()

厄介な「C言語のような」ifdefクローンを使用せずに、AとBの両方でCをインポートでき、問題なく動作することがわかりました。私の質問は、そのようなモジュールを2回インポートすると、ペナルティが発生するのでしょうか?ACsome_module == C.some_module?それとも私はこれをすることによってただ悪い男の子になっているのですか?

4

1 に答える 1

3

モジュールを2回インポートしても、モジュールが2回ロードされることはありません。Pythonはモジュールを1回ロードし、そのモジュールへの参照を保持します。そうです、Pythonは2つのバージョンが同じであることを知るのに十分賢いです。モジュールは必要なだけインポートでき、「コスト」は1回だけです。

ちなみに、「BにはAとCの関数が含まれる」というのは誤りですimport C。A.pyで行う場合、 A「Cの関数が含まれる」わけではないからです。むしろ、AにはC自体への参照が含まれています。したがって、B内からAをインポートすると、C内の関数への参照ではなく、Cへの参照を取得します。を使用してCの個々の部分をAの名前空間に直接from C import blahBlahインポートすると、Aをインポートするときにそれらの関数にアクセスできるようになります。 Aのメンバーとして。

# A.py
from C import blah

# B.py
import A
A.blah # this will work
于 2012-07-15T18:43:45.073 に答える