そのコードだと動きませんが、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 ドキュメント