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