日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

python白名单验证是什么意思_第10.5节 使用__all__定义Python模块导入白名单

發(fā)布時間:2023/12/19 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python白名单验证是什么意思_第10.5节 使用__all__定义Python模块导入白名单 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、引言

《第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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。