python擴展名,python中模塊文件的擴展名不一定是py_python模塊和python包有什么區別?

 2023-11-11 阅读 27 评论 0

摘要:python模塊和python包有什么區別?python擴展名?另請參見:"package"和"module"(其他語言)之間的區別是什么?我可能錯了,但對我來說:模塊基本上是一個python文件。包是一個文件夾,其中包含一組模塊(python文件)。要

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初學者談過了,他們覺得這完全令人困惑。

所以你記得回到你的課本上,在內容頁上,章節被劃分成模塊。因此,存在著不同的概念,不同的章節有相同的目標或部分相同的理論,然后這些部分聚集在一起,被稱為模塊。同樣,在編程中,當不同的函數聚集在一起時,它們被分開并命名為模塊。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/170808.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息