python中all是什么意思_Python中的__all__
一、模塊公開接口的一種約定
__all__可以在模塊級別暴露接口,形式如下:
__all__ = ["foo", "bar"]
Python 沒有原生的可見性控制,其可見性的維護是靠一套需要大家自覺遵守的”約定“,比如,下劃線開頭的變量對外部不可見。
__all__ 是針對模塊公開接口的一種約定,以提供了”白名單“的形式暴露接口。如果定義了__all__,其他文件中使用from xxx import *導入該文件時,只會導入 __all__ 列出的成員,可以其他成員都被排除在外。
如,test1.py,test2.py,test3.py三個文件:
test1.py
#__all__ = ['func']
def func():
pass
test2.py
import test1
__all__ = ['func2', 'test1']
def func2():
pass
def func22():
pass
test3.py
from test2 import *
func2() #能正常引用
test1.func() #能正常引用
func22() #不能正常引用
二、控制 from xxx import * 的行為
python不提倡用 from xxx import * 這種寫法。如果一個模塊 xxx 沒有定義 __all__,執行 from spam import * 時會將 xxx 中所有非下劃線開頭的成員(包括該模塊import的其他模塊成員)都會導入當前命名空間,這樣就可能弄臟當前的命名空間。顯式聲明了 __all__,import * 就只會導入 __all__ 列出的成員,如果 __all__ 定義有誤,還會明確地拋出異常,方便檢查錯誤。
三、為 lint 等代碼檢查工具提供輔助
編寫庫時,經常會在 __init__.py 中暴露整個包的 API,而這些 API 的實現可能是在包的其他模塊中。如果僅僅這樣寫:from xxx import a, b,一些代碼檢查工具,如 pyflakes 會報錯,認為變量 a和 b import 了但沒被使用。一個可行的方法是把這個警告壓掉:from xxx import a, b # noqa (No Q/A,即無質量保證),但更好的方法是顯式定義 __all__,這樣代碼檢查工具就會理解,從而不再報 unused variables 的警告。
四、定義 all 需要注意的地方__all__ 的形式都是 list類型。如果寫成其他類型, pyflakes 等 lint 工具可能無法識別。
不能動態生成 __all__,如使用列表解析式。__all__ 的作用是定義公開接口,需要以字面量的形式顯式寫出來。
即使定義了 __all__, 也不應該在非臨時代碼中使用 from xxx import * 語法,或用編程工具模擬 Ruby 的自動 import。Python 不像 Ruby,沒有 Module 這類成員,模塊就是命名空間隔離的執行者。如果打破了這一層,引入諸多動態因素,生產環境中跑的代碼就可能充滿不確定性,調試也會變得困難。
按照 PEP8 建議的風格,__all__ 應該寫在所有 import 語句下面,函數、常量等成員定義的上面。
如果一個模塊需要暴露的接口改動頻繁,__all__ 可以這樣定義:
__all__ = [
"foo",
"bar",
"egg",
]
這樣修改一個暴露的接口只修改一行,方便版本控制的時候看 diff。最后多出的逗號在 Python 中是允許的,符合 PEP8 風格。
總結
以上是生活随笔為你收集整理的python中all是什么意思_Python中的__all__的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大货车胎压报警怎么消除?
- 下一篇: python 时间序列分解 stl_ju