python白名单验证是什么意思_第10.5节 使用__all__定义Python模块导入白名单
一、引言
《第10.4節 Python模塊的弱封裝機制》介紹了Python模塊的的弱封裝機制,除了使用弱封裝機制來從一定程度上防止導入特定成員外,Python模塊中還提供可另外一種類似白名單的機制來控制導入的成員,這個機制就是在模塊中定義__all__變量,將__all__的值設置成一個列表,只有列表中的模塊成員才能被導入。
二、方法介紹
在模塊內部定義一個模塊內的全局變量__all__,其元素是每個需要允許導出的成員名字符串。
all = [‘成員名1’,…,‘成員名n’]
三、案例
1、我們定義一個imptest模塊,包括三個成員變量和5個成員函數,內容如下:
#imptest.py
__all__=['f','_f1','var2','_var3']
var1,var2,_var3='imptest var1','imptest var2','imptest _var3'
_var2
def f():
print("execute ftest function in imptest....")
def _f1():
print("execute _f1(單下劃線開頭) function in imptest....")
def __f2():
print("execute __f2(雙下劃線開頭) function in imptest....")
def __f3__():
print("execute __f3__(雙下劃線開頭結尾) function in imptest....")
def f4():
print("execute f4 function in imptest....")
print("Now in imptest module!")
2、使用“from 模塊名 import *”導入imptest模塊的成員并執行驗證是否導入成功
>>> from imptest import *
Now in imptest module!
>>> var1
Traceback (most recent call last):
File "", line 1, in
var1
NameError: name 'var1' is not defined
>>> var2
'imptest var2'
>>> _var3
'imptest _var3'
>>> f()
execute ftest function in imptest....
>>> _f1()
execute _f1(單下劃線開頭) function in imptest....
>>> __f2()
Traceback (most recent call last):
File "", line 1, in
__f2()
NameError: name '__f2' is not defined
>>>
執行截圖:
從上述執行情況來看,只有在__all__列表中的成員才能通過“from imptest import *”導入,帶下劃線的也會正常導入,沒有在__all__列表中的成員計算無下劃線開頭也不能導入。
3、直接使用“import 模塊名”導入
源代碼:
>>> import imptest
Now in imptest module!
>>> imptest.f()
execute ftest function in imptest....
>>> imptest._f1()
execute _f1(單下劃線開頭) function in imptest....
>>> imptest.__f2()
execute __f2(雙下劃線開頭) function in imptest....
>>> imptest.__f3__()
execute __f3__(雙下劃線開頭結尾) function in imptest....
>>> imptest.var1,imptest.var2,imptest._var3
('imptest var1', 'imptest var2', 'imptest _var3')
>>>
執行截屏:
從上述執行情況來看,使用“import 模塊名”導入后,所有成員都可以正常訪問,不受__all__列表的影響。
四、總結
使用__all__定義模塊訪問白名單:
只對“from 模塊名 import *”導入產生影響,對“import 模塊名”或“from 模塊名 import 成員名”不產生影響;
在__all__列表中的元素不論是否帶下劃線開頭,“from 模塊名 import *”都會導入,不受模塊的缺省封裝機制影響,可以說這是另一種方式的封裝;
在模塊定義__all__變量后,可以使用“模塊.__all__”查看模塊建議使用的模塊成員。
__all__變量可以認為給模塊定義了一個開放的公共接口。通常來說,只有__all__變量列出的模塊屬性,才是該模塊建議外界使用的。因此,為一個大模塊定義__all__ 變量,就可以給調用程序建議過濾不需要使用的變量、函數和類,只使用__all__定義的白名單屬性。
前面章節介紹過 dir(模塊名)可返回模塊或類所包含的全部程序單元(包括變量、函數、類和方法等),但直接使用 dir() 函數默認會列出模塊內所有的屬性,包括以下劃線開頭的屬性,如果模塊定義了__all__ 變量,則建議調用者只關注__all__ 變量限定的屬性。
總結
以上是生活随笔為你收集整理的python白名单验证是什么意思_第10.5节 使用__all__定义Python模块导入白名单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用来进行钢结构节点输出的软件是什么_高
- 下一篇: python函数调用的一般形式_Pyth