最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中使用語(yǔ)句導(dǎo)入模塊或包的機(jī)制研究

 更新時(shí)間:2015年03月30日 09:58:23   作者:Shahriar Tajbakhsh  
這篇文章主要介紹了Python中使用語(yǔ)句導(dǎo)入模塊或包的機(jī)制研究,同時(shí)對(duì)比了幾種導(dǎo)入包或模塊的語(yǔ)句并簡(jiǎn)要說(shuō)明了這幾種方法之間的幾點(diǎn)優(yōu)劣,需要的朋友可以參考下

這篇文章討論了Python的from <module> import *和from <package> import *,它們?cè)趺磮?zhí)行以及為什么使用這種語(yǔ)法(也許)是一個(gè)壞主意。
從一個(gè)模塊導(dǎo)入全部

from <module> import * means意味著“我希望能訪問(wèn)<module>中我有權(quán)限訪問(wèn)的全部名稱”。例如以下代碼something.py:
 

# something.py
 
public_variable = 42
_private_variable = 141
 
def public_function():
  print("I'm a public function! yay!")
 
def _private_function():
  print("Ain't nobody accessing me from another module...usually")
 
class PublicClass(object):
  pass
 
class _WeirdClass(object):
  pass

在Python解釋器中,我們可以執(zhí)行from something import *,然后看到如下的內(nèi)容:
 

>>> from something import *
>>> public_variable
42
>>> _private_variable
...
NameError: name '_private_variable' is not defined
>>> public_function()
"I'm a public function! yay!"
>>> _private_function()
...
NameError: name '_private_function' is not defined
>>> c = PublicClass()
>>> c
<something.PublicClass object at ...>
>>> c = _WeirdClass()
...
NameError: name '_WeirdClass' is not defined

from something import *從something中導(dǎo)入了除了以_開(kāi)頭名稱外的其他所有名稱,按照規(guī)范,_開(kāi)始的名稱是私有的所以未被導(dǎo)入。
嗯,不是特別糟!還有什么?

上面沒(méi)提到__all__是什么。__all__是一個(gè)字符串列表,指定了當(dāng)from <module> import *被使用時(shí),模塊(或者如后文會(huì)提到的包)中的哪些符號(hào)會(huì)被導(dǎo)出。如果我們不定義__all__(我們?cè)谏厦娴膕omething.py就沒(méi)定義),import *默認(rèn)的導(dǎo)入方式是導(dǎo)入除了下劃線(_)開(kāi)頭的所有名稱。再說(shuō)一次,編程慣例上下劃線表示一個(gè)符號(hào)是私有的,不導(dǎo)入是合理的。讓我們來(lái)看看在something.py中定義我們自己的__all__會(huì)發(fā)生什么。
 

# something.py
 
__all__ = ['_private_variable', 'PublicClass']
 
# The rest is the same as before
 
public_variable = 42
_private_variable = 141
 
def public_function():
  print("I'm a public function! yay!")
 
def _private_function():
  print("Ain't nobody accessing me from another module...usually")
 
class PublicClass(object):
  pass
 
class _WeirdClass(object):
  pass

現(xiàn)在,我們期望from something import *只會(huì)導(dǎo)入_private_variable和PublicClass:
 

>>> from something import *
>>> public_variable
42
>>> _private_variable
...
NameError: name '_private_variable' is not defined
>>> public_function()
"I'm a public function! yay!"
>>> _private_function()
...
NameError: name '_private_function' is not defined
>>> c = PublicClass()
>>> c
<something.PublicClass object at ...>
>>> c = _WeirdClass()
...
NameError: name '_WeirdClass' is not defined

包是怎樣的呢?

當(dāng)從一個(gè)包中導(dǎo)入全部時(shí),__all__的做法和模塊基本一樣,不過(guò)它處理的是包中的模塊(而不是把模塊中的名都導(dǎo)入)。所以當(dāng)我們使用from <package> import *.時(shí)__all__說(shuō)明了所有需要被導(dǎo)入當(dāng)前命名空間的模塊。

不同之處在于,如果你在一個(gè)包的__init__.py里面沒(méi)有聲明__all__,from <package> import *語(yǔ)句不會(huì)導(dǎo)入任何東西(這個(gè)說(shuō)法也不全對(duì),正確的說(shuō)法在此
但是,這有什么不好?

繼續(xù)讀之前,在你的Python解釋器中,執(zhí)行import this,再讀一遍Python之禪(在你孩子每晚睡前也要讀給他們)。

    明確比含糊要好。

from <module> import * 是不明確的。它沒(méi)告訴我們我們正在導(dǎo)入什么或者我們把什么帶入當(dāng)前命名空間了。更好的做法是顯式地導(dǎo)入我們需要的全部名稱。這種方式下,讀者(非常可能是未來(lái)的你自己)就不會(huì)困惑于你代碼中使用的一個(gè)變量/方法/類/其他東西是哪兒來(lái)的,這也告訴了我們下一點(diǎn):

    可讀性很重要

即使你需要導(dǎo)入很多東西,一個(gè)一個(gè)顯式地導(dǎo)入也更清楚。使用PEP 328:
 

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
  LEFT, DISABLED, NORMAL, RIDGE, END)

你現(xiàn)在就能明確知道你的命名空間里有什么,使用ctrl+f能很快地告訴你它們是哪兒來(lái)的。

同時(shí),你還總是要承擔(dān)模塊/包作者更改list內(nèi)容(加/減東西)的風(fēng)險(xiǎn)。也就是下面兩者之一:

    作者從__all__里刪除了一個(gè)字符串。如果你的代碼使用了那個(gè)名字,你的代碼就會(huì)報(bào)出NameError的錯(cuò)誤,并且很難發(fā)現(xiàn)為什么。
    作者在__all__里加入了很多東西。你也許不需要這些增加的內(nèi)容,所以你只是讓這些你不關(guān)心的東西占滿了你的命名空間。他們甚至在你不注意的時(shí)候會(huì)替代其他同名內(nèi)容。

當(dāng)然,有時(shí)候從模塊或者包中導(dǎo)入全部?jī)?nèi)容是有用的。不過(guò),這么做之前三思。從我的經(jīng)驗(yàn)來(lái)看,這么做通常只是因?yàn)閼小?br />

相關(guān)文章

  • 在python中以相同順序shuffle兩個(gè)list的方法

    在python中以相同順序shuffle兩個(gè)list的方法

    今天小編就為大家分享一篇在python中以相同順序shuffle兩個(gè)list的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • 解決Pymongo insert時(shí)會(huì)自動(dòng)添加_id的問(wèn)題

    解決Pymongo insert時(shí)會(huì)自動(dòng)添加_id的問(wèn)題

    這篇文章主要介紹了解決Pymongo insert時(shí)會(huì)自動(dòng)添加_id的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Python 根據(jù)數(shù)據(jù)模板創(chuàng)建shapefile的實(shí)現(xiàn)

    Python 根據(jù)數(shù)據(jù)模板創(chuàng)建shapefile的實(shí)現(xiàn)

    今天小編就為大家分享一篇Python 根據(jù)數(shù)據(jù)模板創(chuàng)建shapefile的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • 火遍網(wǎng)絡(luò)的python中秋節(jié)賀卡現(xiàn)在學(xué)還趕得上

    火遍網(wǎng)絡(luò)的python中秋節(jié)賀卡現(xiàn)在學(xué)還趕得上

    中秋將至,我用python編寫(xiě)了個(gè)火遍網(wǎng)絡(luò)的中秋節(jié)賀卡,現(xiàn)在學(xué)起來(lái)還不晚,文中給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Python練習(xí)-承壓計(jì)算

    Python練習(xí)-承壓計(jì)算

    這篇文章主要介紹了Python練習(xí)-承壓計(jì)算,前面我們練習(xí)了Python購(gòu)物單,這篇我們繼續(xù)練習(xí)承壓計(jì)算,和前篇文章一樣還是問(wèn)題描述開(kāi)始,需要的小伙伴可以參考一下
    2022-01-01
  • python爬蟲(chóng)解決驗(yàn)證碼的思路及示例

    python爬蟲(chóng)解決驗(yàn)證碼的思路及示例

    這篇文章主要介紹了python爬蟲(chóng)解決驗(yàn)證碼的思路及示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Python中pygame游戲模塊的用法詳解

    Python中pygame游戲模塊的用法詳解

    Pygame是一組用來(lái)開(kāi)發(fā)游戲軟件的 Python 程序模塊,Pygame 在 SDL(Simple DirectMedia Layer) 的基礎(chǔ)上開(kāi)發(fā)而成,它提供了諸多操作模塊,本文給大家介紹了Python中pygame游戲模塊的用法,需要的朋友可以參考下
    2024-01-01
  • 吳恩達(dá)機(jī)器學(xué)習(xí)練習(xí):神經(jīng)網(wǎng)絡(luò)(反向傳播)

    吳恩達(dá)機(jī)器學(xué)習(xí)練習(xí):神經(jīng)網(wǎng)絡(luò)(反向傳播)

    這篇文章主要介紹了學(xué)習(xí)吳恩達(dá)機(jī)器學(xué)習(xí)中的一個(gè)練習(xí):神經(jīng)網(wǎng)絡(luò)(反向傳播),在這個(gè)練習(xí)中,你將實(shí)現(xiàn)反向傳播算法來(lái)學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的參數(shù),需要的朋友可以參考下
    2021-04-04
  • python 判斷字符串是否為空的多種方法

    python 判斷字符串是否為空的多種方法

    這篇文章主要介紹了python 如何判斷字符是否為空,通過(guò)本文的介紹,我們學(xué)習(xí)了三種判斷字符串是否為空的方法,并給出了相應(yīng)的代碼示例,需要的朋友可以參考下
    2024-06-06
  • 使用Keras預(yù)訓(xùn)練模型ResNet50進(jìn)行圖像分類方式

    使用Keras預(yù)訓(xùn)練模型ResNet50進(jìn)行圖像分類方式

    這篇文章主要介紹了使用Keras預(yù)訓(xùn)練模型ResNet50進(jìn)行圖像分類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05

最新評(píng)論

额尔古纳市| 广汉市| 锦州市| 葫芦岛市| 明溪县| 雷州市| 德惠市| 行唐县| 青海省| 呼玛县| 寿宁县| 宜州市| 潜江市| 莲花县| 萝北县| 左权县| 富顺县| 彩票| 揭西县| 象州县| 东港市| 长顺县| 固阳县| 迭部县| 海伦市| 开远市| 崇仁县| 疏勒县| 金华市| 隆尧县| 唐河县| 盐津县| 北票市| 江北区| 彭山县| 鄂托克前旗| 忻城县| 那坡县| 盐亭县| 新丰县| 建水县|