您好,登錄后才能下訂單哦!
Python中包的引入怎么理解?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
Python的from import *和from import *,它們的功能都是將包引入使用,但是它們是怎么執行的以及為什么使用這種語法呢?
從一模塊導入全部功能
from import * means意味著“我希望能訪問中我有權限訪問的全部名稱”。例如以下代碼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解釋器中,我們可以執行from something import *,然后看到如下的內容:
>>> 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中導入了除了以_開頭名稱外的其他所有名稱,按照規范,_開始的名稱是私有的所以未被導入。
上面沒提到__all__是什么。__all__是一個字符串列表,指定了當from import *被使用時,模塊(或者如后文會提到的包)中的哪些符號會被導出。如果我們不定義__all__(我們在上面的something.py就沒定義),import *默認的導入方式是導入除了下劃線(_)開頭的所有名稱。再說一次,編程慣例上下劃線表示一個符號是私有的,不導入是合理的。讓我們來看看在something.py中定義我們自己的__all__會發生什么。
# 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
現在,我們期望from something import *只會導入_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
包是怎樣的呢?
當從一個包中導入全部時,__all__的做法和模塊基本一樣,不過它處理的是包中的模塊(而不是把模塊中的名都導入)。所以當我們使用from import *.時__all__說明了所有需要被導入當前命名空間的模塊。
不同之處在于,如果你在一個包的__init__.py里面沒有聲明__all__,from import *語句不會導入任何東西(這個說法也不全對,正確的說法在此)
但是,這有什么不好?
繼續讀之前,在你的Python解釋器中,執行import this,再讀一遍Python之禪(在你孩子每晚睡前也要讀給他們)。
明確比含糊要好。
from import * 是不明確的。它沒告訴我們我們正在導入什么或者我們把什么帶入當前命名空間了。更好的做法是顯式地導入我們需要的全部名稱。這種方式下,讀者(非常可能是未來的你自己)就不會困惑于你代碼中使用的一個變量/方法/類/其他東西是哪兒來的,這也告訴了我們下一點:
可讀性很重要
即使你需要導入很多東西,一個一個顯式地導入也更清楚。使用PEP 328:
from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text, LEFT, DISABLED, NORMAL, RIDGE, END)
你現在就能明確知道你的命名空間里有什么,使用ctrl+f能很快地告訴你它們是哪兒來的。
同時,你還總是要承擔模塊/包作者更改list內容(加/減東西)的風險。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。