2009-08-19 15 views
6
"""module a.py""" 
test = "I am test" 
_test = "I am _test" 
__test = "I am __test" 

============= "_" をリードする(アンダーバー)となぜ "インポート"と "インポート*"に違いがありますか?

~ $ python 
Python 2.6.2 (r262:71600, Apr 16 2009, 09:17:39) 
[GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from a import * 
>>> test 
'I am test' 
>>> _test 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name '_test' is not defined 
>>> __test 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name '__test' is not defined 
>>> import a 
>>> a.test 
'I am test' 
>>> a._test 
'I am _test' 
>>> a.__test 
'I am __test' 
>>> 

答えて

21

変数がパブリック名ではなく、from x import *を使用する場合にインポートされません。

ここで、_test__testpublicではありません。 import文の説明から

識別子のリストは、星(「*」)で を交換した場合、モジュール内で定義されたすべてのパブリック名 はの ローカル名前空間にバインドされていますインポート の文..モジュール によって定義された

パブリック名を変数 という名前__all__ため モジュールの名前空間をチェックすることで決定されます。定義されている場合は であり、そのモジュールによって定義またはインポートされた名前は である文字列のシーケンスでなければなりません。 __all__で指定されている名前はすべて となっており、 が必要です。 __all__が定義されていない場合、 パブリック名のセットには、 という名前がモジュールのネームスペースに含まれています。 はアンダースコアで始まりません。 文字( '_')。 __all__には にパブリックAPI全体が含まれている必要があります。誤って APIの一部でないアイテム( モジュールにインポートされて使用されたライブラリモジュールなど)をエクスポートすることを避けるために、 です。

関連する問題