2

Python がモジュール名を処理する方法に奇妙な動作があることに気付きました。

私が書く場合:

import a.b
import a

モジュール ab で何かを参照しようとすると、問題なく動作します。

ただし、少しだけ異なることを試みると、次のようになります。

import a.b
import c as a

モジュール ab で何かを参照しようとすると、次のようなエラーが表示されます。

AttributeError: 'module' オブジェクトに属性 'b' がありません

明らかな解決策は、同じ名前で参照する 2 つの異なるモジュールを持たないことであることを理解しています。ただし、この動作の変化の原因は何なのか、まだ興味があります。一方が機能し、もう一方が機能しないのはなぜですか?

4

4 に答える 4

11

なぜそれが機能することを期待していますか?import ステートメントの 4 つすべてが variable への代入ですa。したがって、に割り当てるca、内容が属性を持たないもので上書きされ.bます。


最初のケースでは次のようになります。

  1. import a.b実行されると、Python は moduleaをロードa.bし、ロードされたaモジュールの属性にモジュールをロードしますb。次に、結果を変数に代入しますa
  2. モジュールは既にロードされているため、はimport a新しいものをインポートしません。a同じモジュールを からsys.modules['a']に再割り当てするだけaです。

2 番目のケースでは、次のようになります。

  1. import a.b実行されると、Python は moduleaをロードa.bし、ロードされたaモジュールの属性にモジュールをロードしますb。次に、結果を変数に代入しますa
  2. import c as a実行されると、モジュールがロードされ、そのモジュールが変数にc割り当てられ、内容が上書きされます( )。の内容との内容を比較することで、これを確認できます。この場合は異なります。aa = sys.modules['c']sys.modules['a']a
于 2012-10-06T17:38:30.573 に答える
3

最初のケースでaは、実際のパッケージa(モジュールを含むb) を参照します。これは、a.bが に含まれるものを参照することを意味しaます。

2 番目のケースでaは、 module を参照しますc.py。まるであなたが試したかのようですimport c; a = c。ここでc、属性がない場合b、失敗します。

于 2012-10-06T17:39:24.403 に答える
3

もし、あんたがimport c as a

それはあなたの以前のものを上書きしますa

だからあなたが電話をかけようとすると、a.bあなたは本当に電話をかけますc.b

于 2012-10-06T17:38:22.367 に答える
2

「import as」ステートメントを実行すると、実際には代入が実行されます。だからこうすれば

import matplotlib as mp

matplotlibの名前空間をに割り当てていますmp

これには、代入の通常の意味がすべて含まれています。

于 2012-10-06T22:38:08.077 に答える