python是誰維護的 Python模組維護

2021-10-11 13:14:32 字數 2144 閱讀 4728

模組

在python中,乙個.py檔案,就是乙個模組。

cpython虛擬機器自己模擬了程序和執行緒的概念。在cpython初始化執行環境的時候,會建立乙個空的程序,進而在程序中建立乙個空的執行緒。cpython對模組維護的策略是:

python中所有的模組都被維護在程序中,而所有的執行緒共享程序中的模組資源。

cpython用乙個結構體pyinterpreterstate來表示虛擬程序,這裡只列出比較重要的幾行,若要檢視完整**,請參閱cpython原始碼中的include/pystate.**件:

modules:維護了程序中所有的modules(包括內建和使用者自定義模組),維護在乙個字典中。

sysdict:我們最熟悉的sys內建模組,維護在乙個字典中。

builtins:builtins內建模組,維護在乙個字典中。

預設情況下,cpython只會將builtins模組新增到名字空間中,就是__builtins__。我們無法直接訪問modules,但是從圖中可以看出,sys中維護了乙個字段,叫modules,該欄位正好指向了modules:

從sys.modules.keys()可以看到程序中維護的所有模組,比如,__main__模組,sys模組(由此可見,modules中也維護了乙個字段,該欄位指向了sys,sys模組和modules模組互指)。

cpython中的模組是維護在乙個pymoduleobject結構體中的,該結構體的md_dict指向乙個字典,該字典中維護了該模組下的所有符號。當然,cpython還會在md_dict中新增兩個字段:__name__和__doc__,分別用來表示該模組的名字和文件說明:

builtins模組

在python2中,builtins模組叫__builtin__(不加s)。以下敘述,我們使用builtins。

不論是在互動式命令列中,還是在檔案中,我們都可以直接使用一些函式,比如dir()。當輸入dir()的時候,python會在名字空間中尋找dir這個符號,python的名字空間分為:

locals名字空間

globals名字空間

builtin名字空間

python會沿著locals->globals->builtin路徑尋找符號。使用__builtins__.__dict__.keys()就可以看到builtin名字空間中維護的符號。

最後,在builtin名字空間中找到了符號dir。當然,我還可以重定義dir函式,這樣在locals名字空間中,就會維護乙個符號dir,因為python會沿著locals->globals->builtin路徑進行尋找,所以,最先在locals中找到dir,呼叫使用者自定義函式:

那麼,到底什麼是builtins模組呢?我們需要深入去**一下。cpython在建立完程序和執行緒後,所做的第一步事情就是建立builtins模組,所做的操作就是將所有的內建函式新增到該模組中,最後,將builtins模組中的__name__賦值為builtins。我們可以在sys.modules中看到這個模組:

預設情況,builtins模組並沒有被載入到globals名字空間中。但是,python定義了乙個魔術屬性__builtins__來訪問該模組。我想這麼做是為了保持模組操作的一致性。

最後,需要注意的是,當模組不被當做主模組的時候,其globals名字空間中的__builtins__不再指向builtins模組,而是指向了builtins模組的md_dict。

小結:__builtin__在python3中被更名為builtins,該模組被維護在程序結構體的modules中;

__builtins__作為乙個魔法屬性,可以訪問到內建builtins模組;

若是在主模組中,__builtins__和__builtin__(builtins)都指向同乙個內建模組;若是被import的module,其__builtins__則等價於__builtin__.__dict__(builtins.__dict)。原因不詳;

__main__模組

在python中,當前執行的模組,被叫做主模組。

__main__模組是指向自身的模組,預設情況下,該module也未被import。但是,我們可以通過sys.modules訪問到它:

當然,我們也可以將其import:

由此可見,__name__和__main__.__name__就是指向的同乙個字串。因為主模組的名字屬性被改為了'__main__',所以,如果我們想知道主模組的檔案名字,可以使用如下方法:

抖音時代,你是誰的誰?

抖音確實可以算作乙個在歷史上留下一筆濃墨重彩的乙個 愛普 想在抖音的天下裡有乙個自己的時代,那你就需要有乙個清晰的定位 這個定位就是你跨入這個領域的第一步。通俗一點講 你想要在抖音這個15秒的世界裡混出一片天,那你就得讓一大群人知道你是誰 並且這個定位也是你粉絲群體的乙個興趣所在。比如說你是做美食的...

python裡面的self,是誰啊?

對,你沒看錯,這是我初學python時的靈魂發問。我們總會在class裡面看見self,但是感覺他好像也沒什麼用處,就是放在那裡占個位子。如果你也有同樣的疑問,那麼恭喜你,你的class沒學明白。所以,在解釋self是誰之前,我們先明確幾個問題 什麼是class,什麼是instance,什麼是obj...

const 修飾的是誰

const 修飾乙個量,那個量會被放到乙個常量表裡,無論如何,值都不會被改變了 const 修飾指標 int a 3 int p a const int p 指標所指向的記憶體空間無法被改變,即a的值無法被改變 int const p 指標的值無法被改變,即指標只能指向某乙個特定的記憶體空間,這裡只...