0

私は m1.py と m2.py の 2 つのモジュールを作成しました。それぞれが標準ライブラリのさまざまなモジュールを使用します。

例えば

#m1.py
import sys
#.
#.

#m2.py
import os
#.
#.

私が「気になる」のは、main.py に 2 つのモジュール m1.py と m2.py をインポートすると、次のように sys と os で定義された関数を使用できることです。

#main.py
print m1.sys.version
print m2.os.listdir()

これは正常ですか、それともコードにモジュールをインポートするときに考慮すべきことがありますか?

4

1 に答える 1

1

通常、名前空間でアクセスできるものについて心配する必要はありません。モジュールの文書化された API の一部ではないものをいじる者は、どんなトラブルに見舞われても当然です。Python は、プログラマーが責任ある大人であると想定しています。

from mymodule import *例外は、他のコードが推奨されない構文を使用できるようにする場合です。次に、公開するものを制限して、インポーターの名前空間を独自の内部のもので混乱させないようにします。

これを行う方法は次のとおりです。

  • アンダースコアで始まる名前 (例: _foo) は非公開と見なされ、 ではインポートされませんfrom mymodule import *。これは「本当の」プライバシーではありません。通常のインポートを行う人は誰でも経由でアクセスできるからですmymodule._foo(しかし、そうすべきではありません!)。

  • インポートするモジュールを非公開にしたい場合は、as節を使用して、上記のように「非公開」の名前を付けます。つまり、 を使用しますimport os as _os

  • または、アンダースコアをいじる代わりに__all__、モジュールのパブリック名を明示的にリストする変数を作成できます。リスト内の名前のみがfrom mymodule import *ステートメントでインポートされます。__all__サブモジュールを 経由でインポートできるようにする場合は、パッケージにシーケンスが必要であることに注意してくださいfrom mypackage import *。これは、Python が、パッケージに含まれるファイル名の大文字と小文字を混同しないようにファイル システムを信頼できないためです。

于 2013-03-21T14:41:47.583 に答える