python模塊和python包有什么區別?
python擴展名?另請參見:"package"和"module"(其他語言)之間的區別是什么?
我可能錯了,但對我來說:模塊基本上是一個python文件。包是一個文件夾,其中包含一組模塊(python文件)。
要被視為包,該文件夾必須包含一個__init__.py文件。
@LC2817:這是最常見的情況,但不需要從文件系統加載模塊,例如,參見from plumbum.cmd import ls實現。
@Giuliopincastelli:在python 3.3+中,命名空間包不使用__init__.py。
社區如何區分python包和用于分發pypi/wheels/etc等python組件的包?這兩個詞對我來說似乎是"包裹"這個詞的不同應用。
任何python文件都是一個模塊,其名稱是沒有.py擴展名的文件的基名稱。包是python模塊的集合:當模塊是單個python文件時,包是包含額外__init__.py文件的python模塊的目錄,用于區分包與剛好包含一組python腳本的目錄。包可以嵌套到任何深度,前提是相應的目錄包含自己的__init__.py文件。
模塊和包之間的區別似乎僅限于文件系統級別。導入模塊或包時,python創建的相應對象始終為module類型。但是,請注意,導入包時,只有該包的__init__.py文件中的變量/函數/類是直接可見的,而不是子包或模塊。例如,考慮python標準庫中的xml包:它的xml目錄包含一個__init__.py文件和四個子目錄;子目錄etree包含一個__init__.py文件,以及一個ElementTree.py文件。查看當您嘗試以交互方式導入包/模塊時會發生什么:
>>> import xml
>>> type(xml)
>>> xml.etree.ElementTree
Traceback (most recent call last):
File"", line 1, in
AttributeError: 'module' object has no attribute 'etree'
>>> import xml.etree
>>> type(xml.etree)
>>> xml.etree.ElementTree
Traceback (most recent call last):
File"", line 1, in
AttributeError: 'module' object has no attribute 'ElementTree'
>>> import xml.etree.ElementTree
>>> type(xml.etree.ElementTree)
>>> xml.etree.ElementTree.parse
在python中,也有一些內置模塊,如sys,它們是用C語言編寫的,但我認為您不打算考慮您所討論的那些模塊。
沒有愛的功能,但是更好的解釋;)。< 3
感謝您明確指出,python創建的相應對象始終是module類型。我正在編寫一個調試器,我擔心我的調試器說我的包是module的錯誤。
@你真是個無愛的人。
"任何python文件都是一個模塊"不是一個有用的描述。包含破折號的python文件,如function-of-love.py,無法導入,我不會調用它們模塊。對于不同的腳本文件,如function-of-love.py,它是一個有用的設計模式,這些腳本文件不能從可以導入的模塊文件(如function_of_love.py)中導入。
@帶有包含破折號的文件名的jolvi python文件仍然可以作為模塊導入,只是不能用通常的import語句導入,因為在python標識符中不允許使用破折號。用importlib.import_module()代替。
@朱利奧皮安卡斯泰利,你是說使用破折號作為模塊名是合理的習慣嗎?
@我不是喬維。你在我的評論里讀到了什么?我只是說,如果您碰巧遇到一個名為破折號的python文件,您仍然可以將其作為模塊導入。我沒有對命名python文件的首選方法做任何聲明。我相信你可以在其他地方找到它:通常強烈建議避免使用破折號而使用下劃線。
@Giuliopincastelli您同意在不打算導入的python文件的文件名中使用破折號是一種常見的命名約定嗎?我很樂意把我上面的評論從"不能"改為"不應該"。
@我從未聽說過這樣的約定。
感謝您幫助我使用xml.etree。
由于對python不熟悉,在導入父包時,子包或模塊在默認情況下不可用,這讓我很困惑。有什么特別的原因嗎?在導入父包時,是否有一個通用的模式,如何使子包或模塊可用(通過它們的完全限定名)?
@sschuberth只在父包的init.py中導入子包。
@安娜,但那只有當我控制了父包,而不是第三方包時才有效,對嗎?
@當然可以。但是,第三方包作者可能會在其包中包含這樣的導入。(我指的當然是__init__.py。)
模塊是在一次導入下導入并使用的單個文件(或多個文件)。例如
import my_module
包是目錄中提供包層次結構的模塊集合。
from my_package.timing.danger.internets import function_of_love
模塊文檔
軟件包簡介
當你說:"一個模塊是在一次導入下導入的一個或多個文件"時,你能解釋一個模塊是多個文件的情況嗎?還是我誤解了你的意思?
當包文件夾名稱包含一個或多個句點時會發生什么?
根據文檔,模塊是單個文件。它沒有說多個文件可以是一個模塊。
您不需要文件來創建模塊,例如,您可以從zip文件導入模塊。包裝也一樣。在Python中,模塊/包只有一個類。包只是一個具有__path__屬性的模塊。
@oldgeezer:那么它不能是包,因為名稱必須是有效的python標識符。這同樣適用于除字母、數字和下劃線之外的任何其他字符。
軟件包也是模塊。它們的打包方式不同;它們是由目錄加上__init__.py文件組合而成的。它們是可以包含其他模塊的模塊。
根據PEP8,不鼓勵在包命名時使用下劃線。
@MartijnPieers您是否有一個鏈接來支持包也是模塊?我同意Mareofraft和模塊是單個文件的文檔。你的話,即使是真的,也只會增加混亂
@當然,請參閱參考文檔中的導入系統:務必記住,所有包都是模塊。
@雅克:"package"術語表:可以包含子模塊或遞歸子包的python模塊。從技術上講,包是具有__path__屬性的python模塊。
@雅克:只有一個文件,__init__.py子模塊是包目錄中的獨立文件(包括更多的包)。
從python詞匯表中:
It’s important to keep in mind that all packages are modules, but not all modules are packages. Or put another way, packages are just a special kind of module. Specifically, any module that contains a __path__ attribute is considered a package.
名稱中帶有破折號的python文件,如my-file.py,不能用簡單的import語句導入。代碼方面,import my-file與import my - file相同,這將引發異常。這樣的文件更好地被描述為腳本,而可導入的文件則是模塊。
是的,增加了混亂:)
首先,請記住,在其精確定義中,模塊是Python解釋器內存中的對象,通常是通過從磁盤讀取一個或多個文件而創建的。雖然我們可以非正式地將磁盤文件(如a/b/c.py稱為"模塊"),但在它與來自其他幾個來源(如sys.path的信息組合以創建模塊對象之前,它實際上不會成為一個文件。(例如,請注意,根據sys.path和其他設置,可以從同一文件加載兩個具有不同名稱的模塊。)
包是一個可能有子模塊(包括子包)的模塊。并非所有模塊都能做到這一點。例如,創建一個小的模塊層次結構:
$ mkdir -p a/b
$ touch a/b/c.py
確保a下沒有其他文件。啟動python 3.4或更高版本的解釋器(例如,使用python3 -i)并檢查以下語句的結果:
import a
a ? ? ? ? ? ? ? ??
a.b ? ? ? ? ? ? ?? AttributeError: module 'a' has no attribute 'b'
import a.b.c
a.b ? ? ? ? ? ? ??
a.b.c ? ? ? ? ? ??
模塊a和a.b是包(實際上,一種稱為"名稱空間包"的包,盡管我們在這里不擔心)。但是,模塊a.b.c不是一個包。我們可以通過在上面的目錄結構中添加另一個文件a/b.py并啟動一個新的解釋器來證明這一點:
import a.b.c
? ImportError: No module named 'a.b.c'; 'a.b' is not a package
import a.b
a ? ? ? ? ? ? ? ??
a.__path__ ? ? ? ? _NamespacePath(['/.../a'])
a.b ? ? ? ? ? ? ??
a.b.__path__ ? ? ? AttributeError: 'module' object has no attribute '__path__'
python確保在加載子模塊之前加載所有父模塊。上面發現a/是一個目錄,因此創建了一個名稱空間包a,a/b.py是一個python源文件,它加載并用于創建(非包)模塊a.b。此時,您不能有一個模塊a.b.c,因為a.b不是一個包,因此不能有子模塊。
您還可以看到包模塊a具有__path__屬性(包必須具有此屬性),但非包模塊a.b沒有。
一個遲來的答案,還有另一個定義:
A package is represented by an imported top-entity which could either
be a self-contained module, or the __init__.py special module as the
top-entity from a set of modules within a sub directory structure.
因此,從物理上講,包是一個分發單元,它提供一個或多個模塊。
我覺得在python中有兩個包定義,它們是不同的。你的回答似乎把它們結合在一起了。嚴格地說,python包是一個目錄,里面有一個__init__.py模塊,但是如果您談論的是分發單元(通常通過pypi),那么這完全是另一種類型的包(通常由setup.py的存在來定義)。我發現術語package的這兩個用法令人困惑,我已經和一些Python初學者談過了,他們覺得這完全令人困惑。
所以你記得回到你的課本上,在內容頁上,章節被劃分成模塊。因此,存在著不同的概念,不同的章節有相同的目標或部分相同的理論,然后這些部分聚集在一起,被稱為模塊。同樣,在編程中,當不同的函數聚集在一起時,它們被分開并命名為模塊。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态