そのコードだと動きませんが、B.pyで
python
1import A
2
3print(A.math.pi)
とすれば動きます。あるいは、
python
1from A import math
2
3print(math.pi)
も可能です。
説明
- まず、ここでの
import A
という記述は、内部的には
A.py
というファイルを読み込んでpythonとして解釈し、モジュールオブジェクトというものを作る。モジュールオブジェクトにはそのスクリプトのトップレベルスコープで定義されている変数(ここでは名前とオブジェクトの対応付けのこととしておきます)がすべて含まれていて、それらは属性としてアクセスできる
- 作ったモジュールオブジェクトを
A
という変数に代入する
という操作をしています。A.py
でのimport math
も同じような事情で処理されているので、A
の属性にはmath
という変数があります。
よって、A.math
はA
に束縛されているmath
という属性へのアクセスとして処理され、math
が表すモジュールオブジェクトへのアクセスが可能になります。
from A import math
はA.py
をモジュールオブジェクトに変換するところまでは同じで、その後A.math
でアクセスできるオブジェクトを取ってきて、B.py
が実行される名前空間上でmath
という名前に束縛する、という操作を行います。なのでこちらはmath
でアクセスできます。
まだpythonに不慣れな方であればこのあたりの挙動を完全に理解する必要はないけど、
- スクリプト(モジュール)ごとに別々の変数の一覧表を持っている
- 他のスクリプト(モジュール)で定義された変数には
モジュール名.変数名
という属性を使ってアクセスする方法、from モジュール名 import 変数名
のようにインポートして、インポート元の名前空間に束縛する方法
があるということは覚えておいてください。
ちなみに、上では「変数」と書きましたが、実際には関数もクラスもすべてこの機構で処理されます。なので、pythonを扱う上ではとても重要なことです。
公式のチュートリアルに簡単な説明があるので、こちらも読んでおいてください。
6. モジュール (module) — Python 3.7.4rc2 ドキュメント