簡體   English   中英

如何從模塊導入函數在Python中工作?

[英]How does importing a function from a module work in Python?

我有一個模塊some_module.py ,其中包含以下代碼:

def testf():
    print(os.listdir())

現在,在名為test.py的文件中,我有以下代碼:

import os
from some_module import testf

testf()

但是執行test.py會給我NameError: name 'os' is not defined 我已經進口的ostest.py ,並testf是在命名空間test.py 那么為什么會出現這種錯誤呢?

import與包含文件內容不同,就像您直接鍵入import語句一樣。 如果你來自C背景,你可能認為它的工作原理是這樣的, #include預處理器指令就是這樣做的,但是Python是不同的。

Python中的import語句讀取正在導入的文件的內容並在其自己的單獨上下文中對其進行評估 - 因此,在您的示例中, some_module.py的代碼無法訪問或了解test.py中存在的任何內容或任何內容其他檔案。 它可以說是一個“空白的板岩”。 如果some_module.py的代碼想要訪問os模塊,則必須在some_module.py的頂部導入它。

在Python中導入模塊時,它將成為一個對象 也就是說,當你寫作

import some_module

Python所做的第一件事就是創建一個類型為module的新對象來表示正在導入的模塊。 當解釋器遍歷some_module.py的代碼時,它會將該文件中定義的任何變量,函數,類等分配為此新模塊對象的屬性。 因此,在您的示例中,模塊對象將具有一個屬性testf 當函數testf的代碼想要訪問變量os ,它會查看函數本身(本地作用域)並看到os未在那里定義,因此它會查看testf所屬的模塊對象的屬性(this是“全球”范圍,雖然它不是真正的全球性。 在你的例子中,它不會在那里看到os ,所以你得到一個錯誤。 如果你添加

import os

some_module.py ,然后將在名稱os下創建模塊的屬性,您的代碼將找到它需要的內容。

您可能還對我編寫的其他一些答案感興趣,這些答案可能有助於您理解Python的import語句:

名稱 testf位於test的名稱空間中。 testf函數的內容仍然在some_module ,並且無法訪問test任何內容。

如果您有需要模塊的代碼,則需要將該模塊導入該代碼所在的同一文件中。 導入模塊只會將其導入到導入模塊的文件中。 (在不同文件中多次導入相同模塊不會產生有意義的性能損失;模塊的實際加載僅發生一次,稍后導入的同一模塊只會獲得對已導入模塊的引用。)

導入模塊會將其名稱添加為當前范圍的屬性。 由於不同的模塊具有獨立的范圍,在任何碼some_module不能使用在名稱__main__而不具有第一進口它(執行腳本)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM