[問与答]Python中_all__ の役割?


Pythonのソースコードや関連フレームワークのソースコードを見ると、__init__.pyまたはソースファイルの先頭に__all__変数の定義が表示されます.今日はその役割についてお話しします.orangleliu
問題の出典
Can someone explain all in Python?
に質問
私はますますPythonを使うようになりました.よく__all__変数といろいろな__init__.pyファイルを見ますが、誰がなぜそんなことをしたのか説明できますか.
に答える
これはstring要素からなるlist変数で、from <module> import *を使用してモジュールをインポートしたときに導出できる記号(ここでは変数、関数、クラスなどを表す)を定義します.
例を挙げると、以下のコードはfoo.pyにおいて、符号barbazが明確に導出されている
__all__ = ['bar', 'baz']

waz = 5
bar = 10
def baz(): return 'baz'

インポートは次のように実現されます.
from foo import *

print bar
print baz

# The following will trigger an exception, as "waz" is not exported by the module
#            ,   "waz"         ,   __all__     
print waz
foo.py__all__を注釈すると、上記のコードは実行されても問題なく、import *のデフォルトの動作は、与えられたネーミングスペースからすべての記号を導出することである(もちろん、下線の先頭のプライベート変数を除く).
に注意
なお、__all__from <module> import *という導入方式にのみ影響し、from <module> import <member>の導入方式には影響せず、外部から導入することができる.