日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python中all是什么意思_Python中的__all__

發布時間:2025/4/5 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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__的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。